blob: 284b134ddd8005f7c8f8e67927bace56d5ef683c [file] [log] [blame]
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001/* Copyright (C) 2008 Rodolfo Giometti <giometti@linux.it>
2 * Copyright (C) 2008 Eurotech S.p.A. <info@eurotech.it>
3 * Based on a previous work by Copyright (C) 2008 Texas Instruments, Inc.
4 *
5 * Copyright (c) 2011, Code Aurora Forum. All rights reserved.
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 and
9 * only version 2 as published by the Free Software Foundation.
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
17#include <linux/module.h>
18#include <linux/param.h>
19#include <linux/jiffies.h>
20#include <linux/workqueue.h>
21#include <linux/delay.h>
22#include <linux/platform_device.h>
23#include <linux/power_supply.h>
24#include <linux/idr.h>
25#include <linux/i2c.h>
26#include <linux/slab.h>
27#include <asm/unaligned.h>
28#include <linux/time.h>
29#include <linux/i2c/bq27520.h>
30#include <linux/mfd/pmic8058.h>
31#include <linux/regulator/pmic8058-regulator.h>
32#include <linux/gpio.h>
33#include <linux/regulator/consumer.h>
34#include <linux/regulator/machine.h>
35#include <linux/err.h>
36#include <linux/msm-charger.h>
37
38#define DRIVER_VERSION "1.1.0"
39/* Bq27520 standard data commands */
40#define BQ27520_REG_CNTL 0x00
41#define BQ27520_REG_AR 0x02
42#define BQ27520_REG_ARTTE 0x04
43#define BQ27520_REG_TEMP 0x06
44#define BQ27520_REG_VOLT 0x08
45#define BQ27520_REG_FLAGS 0x0A
46#define BQ27520_REG_NAC 0x0C
47#define BQ27520_REG_FAC 0x0e
48#define BQ27520_REG_RM 0x10
49#define BQ27520_REG_FCC 0x12
50#define BQ27520_REG_AI 0x14
51#define BQ27520_REG_TTE 0x16
52#define BQ27520_REG_TTF 0x18
53#define BQ27520_REG_SI 0x1a
54#define BQ27520_REG_STTE 0x1c
55#define BQ27520_REG_MLI 0x1e
56#define BQ27520_REG_MLTTE 0x20
57#define BQ27520_REG_AE 0x22
58#define BQ27520_REG_AP 0x24
59#define BQ27520_REG_TTECP 0x26
60#define BQ27520_REG_SOH 0x28
61#define BQ27520_REG_SOC 0x2c
62#define BQ27520_REG_NIC 0x2e
63#define BQ27520_REG_ICR 0x30
64#define BQ27520_REG_LOGIDX 0x32
65#define BQ27520_REG_LOGBUF 0x34
66#define BQ27520_FLAG_DSC BIT(0)
67#define BQ27520_FLAG_FC BIT(9)
68#define BQ27520_FLAG_BAT_DET BIT(3)
69#define BQ27520_CS_DLOGEN BIT(15)
70#define BQ27520_CS_SS BIT(13)
71/* Control subcommands */
72#define BQ27520_SUBCMD_CTNL_STATUS 0x0000
73#define BQ27520_SUBCMD_DEVCIE_TYPE 0x0001
74#define BQ27520_SUBCMD_FW_VER 0x0002
75#define BQ27520_SUBCMD_HW_VER 0x0003
76#define BQ27520_SUBCMD_DF_CSUM 0x0004
77#define BQ27520_SUBCMD_PREV_MACW 0x0007
78#define BQ27520_SUBCMD_CHEM_ID 0x0008
79#define BQ27520_SUBCMD_BD_OFFSET 0x0009
80#define BQ27520_SUBCMD_INT_OFFSET 0x000a
81#define BQ27520_SUBCMD_CC_VER 0x000b
82#define BQ27520_SUBCMD_OCV 0x000c
83#define BQ27520_SUBCMD_BAT_INS 0x000d
84#define BQ27520_SUBCMD_BAT_REM 0x000e
85#define BQ27520_SUBCMD_SET_HIB 0x0011
86#define BQ27520_SUBCMD_CLR_HIB 0x0012
87#define BQ27520_SUBCMD_SET_SLP 0x0013
88#define BQ27520_SUBCMD_CLR_SLP 0x0014
89#define BQ27520_SUBCMD_FCT_RES 0x0015
90#define BQ27520_SUBCMD_ENABLE_DLOG 0x0018
91#define BQ27520_SUBCMD_DISABLE_DLOG 0x0019
92#define BQ27520_SUBCMD_SEALED 0x0020
93#define BQ27520_SUBCMD_ENABLE_IT 0x0021
94#define BQ27520_SUBCMD_DISABLE_IT 0x0023
95#define BQ27520_SUBCMD_CAL_MODE 0x0040
96#define BQ27520_SUBCMD_RESET 0x0041
97
98#define ZERO_DEGREE_CELSIUS_IN_TENTH_KELVIN (-2731)
99#define BQ27520_INIT_DELAY ((HZ)*1)
100#define BQ27520_POLLING_STATUS ((HZ)*3)
101#define BQ27520_COULOMB_POLL ((HZ)*30)
102
103/* If the system has several batteries we need a different name for each
104 * of them...
105 */
106static DEFINE_IDR(battery_id);
107static DEFINE_MUTEX(battery_mutex);
108
109struct bq27520_device_info;
110struct bq27520_access_methods {
111 int (*read)(u8 reg, int *rt_value, int b_single,
112 struct bq27520_device_info *di);
113};
114
115struct bq27520_device_info {
116 struct device *dev;
117 int id;
118 struct bq27520_access_methods *bus;
119 struct i2c_client *client;
120 const struct bq27520_platform_data *pdata;
121 struct work_struct counter;
122 /* 300ms delay is needed after bq27520 is powered up
123 * and before any successful I2C transaction
124 */
125 struct delayed_work hw_config;
126 uint32_t irq;
127};
128
129enum {
130 GET_BATTERY_STATUS,
131 GET_BATTERY_TEMPERATURE,
132 GET_BATTERY_VOLTAGE,
133 GET_BATTERY_CAPACITY,
134 NUM_OF_STATUS,
135};
136
137struct bq27520_status {
138 /* Informations owned and maintained by Bq27520 driver, updated
139 * by poller or SOC_INT interrupt, decoupling from I/Oing
140 * hardware directly
141 */
142 int status[NUM_OF_STATUS];
143 spinlock_t lock;
144 struct delayed_work poller;
145};
146
147static struct bq27520_status current_battery_status;
148static struct bq27520_device_info *bq27520_di;
149static int coulomb_counter;
150static spinlock_t lock; /* protect access to coulomb_counter */
151static struct timer_list timer; /* charge counter timer every 30 secs */
152
153static int bq27520_i2c_txsubcmd(u8 reg, unsigned short subcmd,
154 struct bq27520_device_info *di);
155
156static int bq27520_read(u8 reg, int *rt_value, int b_single,
157 struct bq27520_device_info *di)
158{
159 return di->bus->read(reg, rt_value, b_single, di);
160}
161
162/*
163 * Return the battery temperature in tenths of degree Celsius
164 * Or < 0 if something fails.
165 */
166static int bq27520_battery_temperature(struct bq27520_device_info *di)
167{
168 int ret, temp = 0;
169
170 ret = bq27520_read(BQ27520_REG_TEMP, &temp, 0, di);
171 if (ret) {
172 dev_err(di->dev, "error %d reading temperature\n", ret);
173 return ret;
174 }
175
176 return temp + ZERO_DEGREE_CELSIUS_IN_TENTH_KELVIN;
177}
178
179/*
180 * Return the battery Voltage in milivolts
181 * Or < 0 if something fails.
182 */
183static int bq27520_battery_voltage(struct bq27520_device_info *di)
184{
185 int ret, volt = 0;
186
187 ret = bq27520_read(BQ27520_REG_VOLT, &volt, 0, di);
188 if (ret) {
189 dev_err(di->dev, "error %d reading voltage\n", ret);
190 return ret;
191 }
192
193 return volt;
194}
195
196/*
197 * Return the battery Relative State-of-Charge
198 * Or < 0 if something fails.
199 */
200static int bq27520_battery_rsoc(struct bq27520_device_info *di)
201{
202 int ret, rsoc = 0;
203
204 ret = bq27520_read(BQ27520_REG_SOC, &rsoc, 0, di);
205
206 if (ret) {
207 dev_err(di->dev,
208 "error %d reading relative State-of-Charge\n", ret);
209 return ret;
210 }
211
212 return rsoc;
213}
214
215static void bq27520_cntl_cmd(struct bq27520_device_info *di,
216 int subcmd)
217{
218 bq27520_i2c_txsubcmd(BQ27520_REG_CNTL, subcmd, di);
219}
220
221/*
222 * i2c specific code
223 */
224static int bq27520_i2c_txsubcmd(u8 reg, unsigned short subcmd,
225 struct bq27520_device_info *di)
226{
227 struct i2c_msg msg;
228 unsigned char data[3];
229
230 if (!di->client)
231 return -ENODEV;
232
233 memset(data, 0, sizeof(data));
234 data[0] = reg;
235 data[1] = subcmd & 0x00FF;
236 data[2] = (subcmd & 0xFF00) >> 8;
237
238 msg.addr = di->client->addr;
239 msg.flags = 0;
240 msg.len = 3;
241 msg.buf = data;
242
243 if (i2c_transfer(di->client->adapter, &msg, 1) < 0)
244 return -EIO;
245
246 return 0;
247}
248
249static int bq27520_chip_config(struct bq27520_device_info *di)
250{
251 int flags = 0, ret = 0;
252
253 bq27520_cntl_cmd(di, BQ27520_SUBCMD_CTNL_STATUS);
254 udelay(66);
255 ret = bq27520_read(BQ27520_REG_CNTL, &flags, 0, di);
256 if (ret < 0) {
257 dev_err(di->dev, "error %d reading register %02x\n",
258 ret, BQ27520_REG_CNTL);
259 return ret;
260 }
261 udelay(66);
262
263 bq27520_cntl_cmd(di, BQ27520_SUBCMD_ENABLE_IT);
264 udelay(66);
265
266 if (di->pdata->enable_dlog && !(flags & BQ27520_CS_DLOGEN)) {
267 bq27520_cntl_cmd(di, BQ27520_SUBCMD_ENABLE_DLOG);
268 udelay(66);
269 }
270
271 return 0;
272}
273
274static void bq27520_every_30secs(unsigned long data)
275{
276 struct bq27520_device_info *di = (struct bq27520_device_info *)data;
277
278 schedule_work(&di->counter);
279 mod_timer(&timer, jiffies + BQ27520_COULOMB_POLL);
280}
281
282static void bq27520_coulomb_counter_work(struct work_struct *work)
283{
284 int value = 0, temp = 0, index = 0, ret = 0, count = 0;
285 struct bq27520_device_info *di;
286 unsigned long flags;
287
288 di = container_of(work, struct bq27520_device_info, counter);
289
290 /* retrieve 30 values from FIFO of coulomb data logging buffer
291 * and average over time
292 */
293 do {
294 ret = bq27520_read(BQ27520_REG_LOGBUF, &temp, 0, di);
295 if (ret < 0)
296 break;
297 if (temp != 0x7FFF) {
298 ++count;
299 value += temp;
300 }
301 udelay(66);
302 ret = bq27520_read(BQ27520_REG_LOGIDX, &index, 0, di);
303 if (ret < 0)
304 break;
305 udelay(66);
306 } while (index != 0 || temp != 0x7FFF);
307
308 if (ret < 0) {
309 dev_err(di->dev, "Error %d reading datalog register\n", ret);
310 return;
311 }
312
313 if (count) {
314 spin_lock_irqsave(&lock, flags);
315 coulomb_counter = value/count;
316 spin_unlock_irqrestore(&lock, flags);
317 }
318}
319
320static int bq27520_is_battery_present(void)
321{
322 return 1;
323}
324
325static int bq27520_is_battery_temp_within_range(void)
326{
327 return 1;
328}
329
330static int bq27520_is_battery_id_valid(void)
331{
332 return 1;
333}
334
335static int bq27520_status_getter(int function)
336{
337 int status = 0;
338 unsigned long flags;
339
340 spin_lock_irqsave(&current_battery_status.lock, flags);
341 status = current_battery_status.status[function];
342 spin_unlock_irqrestore(&current_battery_status.lock, flags);
343
344 return status;
345}
346
347static int bq27520_get_battery_mvolts(void)
348{
349 return bq27520_status_getter(GET_BATTERY_VOLTAGE);
350}
351
352static int bq27520_get_battery_temperature(void)
353{
354 return bq27520_status_getter(GET_BATTERY_TEMPERATURE);
355}
356
357static int bq27520_get_battery_status(void)
358{
359 return bq27520_status_getter(GET_BATTERY_STATUS);
360}
361
362static int bq27520_get_remaining_capacity(void)
363{
364 return bq27520_status_getter(GET_BATTERY_CAPACITY);
365}
366
367static struct msm_battery_gauge bq27520_batt_gauge = {
368 .get_battery_mvolts = bq27520_get_battery_mvolts,
369 .get_battery_temperature = bq27520_get_battery_temperature,
370 .is_battery_present = bq27520_is_battery_present,
371 .is_battery_temp_within_range = bq27520_is_battery_temp_within_range,
372 .is_battery_id_valid = bq27520_is_battery_id_valid,
373 .get_battery_status = bq27520_get_battery_status,
374 .get_batt_remaining_capacity = bq27520_get_remaining_capacity,
375};
376
377static void update_current_battery_status(int data)
378{
379 int status[4], ret = 0;
380 unsigned long flag;
381
382 memset(status, 0, sizeof status);
383 ret = bq27520_battery_rsoc(bq27520_di);
384 status[GET_BATTERY_CAPACITY] = (ret < 0) ? 0 : ret;
385
386 status[GET_BATTERY_VOLTAGE] = bq27520_battery_voltage(bq27520_di);
387 status[GET_BATTERY_TEMPERATURE] =
388 bq27520_battery_temperature(bq27520_di);
389
390 spin_lock_irqsave(&current_battery_status.lock, flag);
391 current_battery_status.status[GET_BATTERY_STATUS] = data;
392 current_battery_status.status[GET_BATTERY_VOLTAGE] =
393 status[GET_BATTERY_VOLTAGE];
394 current_battery_status.status[GET_BATTERY_TEMPERATURE] =
395 status[GET_BATTERY_TEMPERATURE];
396 current_battery_status.status[GET_BATTERY_CAPACITY] =
397 status[GET_BATTERY_CAPACITY];
398 spin_unlock_irqrestore(&current_battery_status.lock, flag);
399}
400
401/* only if battery charging satus changes then notify msm_charger. otherwise
402 * only refresh current_batter_status
403 */
404static int if_notify_msm_charger(int *data)
405{
406 int ret = 0, flags = 0, status = 0;
407 unsigned long flag;
408
409 ret = bq27520_read(BQ27520_REG_FLAGS, &flags, 0, bq27520_di);
410 if (ret < 0) {
411 dev_err(bq27520_di->dev, "error %d reading register %02x\n",
412 ret, BQ27520_REG_FLAGS);
413 status = POWER_SUPPLY_STATUS_UNKNOWN;
414 } else {
415 if (flags & BQ27520_FLAG_FC)
416 status = POWER_SUPPLY_STATUS_FULL;
417 else if (flags & BQ27520_FLAG_DSC)
418 status = POWER_SUPPLY_STATUS_DISCHARGING;
419 else
420 status = POWER_SUPPLY_STATUS_CHARGING;
421 }
422
423 *data = status;
424 spin_lock_irqsave(&current_battery_status.lock, flag);
425 ret = (status != current_battery_status.status[GET_BATTERY_STATUS]);
426 spin_unlock_irqrestore(&current_battery_status.lock, flag);
427 return ret;
428}
429
430static void battery_status_poller(struct work_struct *work)
431{
432 int status = 0, temp = 0;
433
434 temp = if_notify_msm_charger(&status);
435 update_current_battery_status(status);
436 if (temp)
437 msm_charger_notify_event(NULL, CHG_BATT_STATUS_CHANGE);
438
439 schedule_delayed_work(&current_battery_status.poller,
440 BQ27520_POLLING_STATUS);
441}
442
443static void bq27520_hw_config(struct work_struct *work)
444{
445 int ret = 0, flags = 0, type = 0, fw_ver = 0, status = 0;
446 struct bq27520_device_info *di;
447
448 di = container_of(work, struct bq27520_device_info, hw_config.work);
449
450 pr_debug(KERN_INFO "Enter bq27520_hw_config\n");
451 ret = bq27520_chip_config(di);
452 if (ret) {
453 dev_err(di->dev, "Failed to config Bq27520 ret = %d\n", ret);
454 return;
455 }
456 /* bq27520 is ready for access, update current_battery_status by reading
457 * from hardware
458 */
459 if_notify_msm_charger(&status);
460 update_current_battery_status(status);
461 msm_charger_notify_event(NULL, CHG_BATT_STATUS_CHANGE);
462
463 enable_irq(di->irq);
464
465 /* poll battery status every 3 seconds, if charging status changes,
466 * notify msm_charger
467 */
468 schedule_delayed_work(&current_battery_status.poller,
469 BQ27520_POLLING_STATUS);
470
471 if (di->pdata->enable_dlog) {
472 schedule_work(&di->counter);
473 init_timer(&timer);
474 timer.function = &bq27520_every_30secs;
475 timer.data = (unsigned long)di;
476 timer.expires = jiffies + BQ27520_COULOMB_POLL;
477 add_timer(&timer);
478 }
479
480 bq27520_cntl_cmd(di, BQ27520_SUBCMD_CTNL_STATUS);
481 udelay(66);
482 bq27520_read(BQ27520_REG_CNTL, &flags, 0, di);
483 bq27520_cntl_cmd(di, BQ27520_SUBCMD_DEVCIE_TYPE);
484 udelay(66);
485 bq27520_read(BQ27520_REG_CNTL, &type, 0, di);
486 bq27520_cntl_cmd(di, BQ27520_SUBCMD_FW_VER);
487 udelay(66);
488 bq27520_read(BQ27520_REG_CNTL, &fw_ver, 0, di);
489
490 dev_info(di->dev, "DEVICE_TYPE is 0x%02X, FIRMWARE_VERSION\
491 is 0x%02X\n", type, fw_ver);
492 dev_info(di->dev, "Complete bq27520 configuration 0x%02X\n", flags);
493}
494
495static int bq27520_read_i2c(u8 reg, int *rt_value, int b_single,
496 struct bq27520_device_info *di)
497{
498 struct i2c_client *client = di->client;
499 struct i2c_msg msg[1];
500 unsigned char data[2];
501 int err;
502
503 if (!client->adapter)
504 return -ENODEV;
505
506 msg->addr = client->addr;
507 msg->flags = 0;
508 msg->len = 1;
509 msg->buf = data;
510
511 data[0] = reg;
512 err = i2c_transfer(client->adapter, msg, 1);
513
514 if (err >= 0) {
515 if (!b_single)
516 msg->len = 2;
517 else
518 msg->len = 1;
519
520 msg->flags = I2C_M_RD;
521 err = i2c_transfer(client->adapter, msg, 1);
522 if (err >= 0) {
523 if (!b_single)
524 *rt_value = get_unaligned_le16(data);
525 else
526 *rt_value = data[0];
527
528 return 0;
529 }
530 }
531 return err;
532}
533
534#ifdef CONFIG_BQ27520_TEST_ENABLE
535static int reg;
536static int subcmd;
537static ssize_t bq27520_read_stdcmd(struct device *dev,
538 struct device_attribute *attr, char *buf)
539{
540 int ret;
541 int temp = 0;
542 struct platform_device *client;
543 struct bq27520_device_info *di;
544
545 client = to_platform_device(dev);
546 di = platform_get_drvdata(client);
547
548 if (reg <= BQ27520_REG_ICR && reg > 0x00) {
549 ret = bq27520_read(reg, &temp, 0, di);
550 if (ret)
551 ret = snprintf(buf, PAGE_SIZE, "Read Error!\n");
552 else
553 ret = snprintf(buf, PAGE_SIZE, "0x%02x\n", temp);
554 } else
555 ret = snprintf(buf, PAGE_SIZE, "Register Error!\n");
556
557 return ret;
558}
559
560static ssize_t bq27520_write_stdcmd(struct device *dev,
561 struct device_attribute *attr, const char *buf, size_t count)
562{
563 ssize_t ret = strnlen(buf, PAGE_SIZE);
564 int cmd;
565
566 sscanf(buf, "%x", &cmd);
567 reg = cmd;
568 dev_info(dev, "recv'd cmd is 0x%02X\n", reg);
569 return ret;
570}
571
572static ssize_t bq27520_read_subcmd(struct device *dev,
573 struct device_attribute *attr, char *buf)
574{
575 int ret, temp = 0;
576 struct platform_device *client;
577 struct bq27520_device_info *di;
578
579 client = to_platform_device(dev);
580 di = platform_get_drvdata(client);
581
582 if (subcmd == BQ27520_SUBCMD_DEVCIE_TYPE ||
583 subcmd == BQ27520_SUBCMD_FW_VER ||
584 subcmd == BQ27520_SUBCMD_HW_VER ||
585 subcmd == BQ27520_SUBCMD_CHEM_ID) {
586
587 bq27520_cntl_cmd(di, subcmd);/* Retrieve Chip status */
588 udelay(66);
589 ret = bq27520_read(BQ27520_REG_CNTL, &temp, 0, di);
590
591 if (ret)
592 ret = snprintf(buf, PAGE_SIZE, "Read Error!\n");
593 else
594 ret = snprintf(buf, PAGE_SIZE, "0x%02x\n", temp);
595 } else
596 ret = snprintf(buf, PAGE_SIZE, "Register Error!\n");
597
598 return ret;
599}
600
601static ssize_t bq27520_write_subcmd(struct device *dev,
602 struct device_attribute *attr, const char *buf, size_t count)
603{
604 ssize_t ret = strnlen(buf, PAGE_SIZE);
605 int cmd;
606
607 sscanf(buf, "%x", &cmd);
608 subcmd = cmd;
609 return ret;
610}
611
612static DEVICE_ATTR(std_cmd, S_IRUGO|S_IWUGO, bq27520_read_stdcmd,
613 bq27520_write_stdcmd);
614static DEVICE_ATTR(sub_cmd, S_IRUGO|S_IWUGO, bq27520_read_subcmd,
615 bq27520_write_subcmd);
616static struct attribute *fs_attrs[] = {
617 &dev_attr_std_cmd.attr,
618 &dev_attr_sub_cmd.attr,
619 NULL,
620};
621static struct attribute_group fs_attr_group = {
622 .attrs = fs_attrs,
623};
624
625static struct platform_device this_device = {
626 .name = "bq27520-test",
627 .id = -1,
628 .dev.platform_data = NULL,
629};
630#endif
631
632static irqreturn_t soc_irqhandler(int irq, void *dev_id)
633{
634 int status = 0, temp = 0;
635
636 temp = if_notify_msm_charger(&status);
637 update_current_battery_status(status);
638 if (temp)
639 msm_charger_notify_event(NULL, CHG_BATT_STATUS_CHANGE);
640 return IRQ_HANDLED;
641}
642
643static struct regulator *vreg_bq27520;
644static int bq27520_power(bool enable, struct bq27520_device_info *di)
645{
646 int rc = 0, ret;
647 const struct bq27520_platform_data *platdata;
648
649 platdata = di->pdata;
650 if (enable) {
651 /* switch on Vreg_S3 */
652 rc = regulator_enable(vreg_bq27520);
653 if (rc < 0) {
654 dev_err(di->dev, "%s: vreg %s %s failed (%d)\n",
655 __func__, platdata->vreg_name, "enable", rc);
656 goto vreg_fail;
657 }
658
659 /* Battery gauge enable and switch on onchip 2.5V LDO */
660 rc = gpio_request(platdata->chip_en, "GAUGE_EN");
661 if (rc) {
662 dev_err(di->dev, "%s: fail to request gpio %d (%d)\n",
663 __func__, platdata->chip_en, rc);
664 goto vreg_fail;
665 }
666
667 gpio_direction_output(platdata->chip_en, 0);
668 gpio_set_value(platdata->chip_en, 1);
669 rc = gpio_request(platdata->soc_int, "GAUGE_SOC_INT");
670 if (rc) {
671 dev_err(di->dev, "%s: fail to request gpio %d (%d)\n",
672 __func__, platdata->soc_int, rc);
673 goto gpio_fail;
674 }
675 gpio_direction_input(platdata->soc_int);
676 di->irq = gpio_to_irq(platdata->soc_int);
677 rc = request_threaded_irq(di->irq, NULL, soc_irqhandler,
678 IRQF_TRIGGER_FALLING|IRQF_TRIGGER_RISING,
679 "BQ27520_IRQ", di);
680 if (rc) {
681 dev_err(di->dev, "%s: fail to request irq %d (%d)\n",
682 __func__, platdata->soc_int, rc);
683 goto irqreq_fail;
684 } else {
685 disable_irq_nosync(di->irq);
686 }
687 } else {
688 free_irq(di->irq, di);
689 gpio_free(platdata->soc_int);
690 /* switch off on-chip 2.5V LDO and disable Battery gauge */
691 gpio_set_value(platdata->chip_en, 0);
692 gpio_free(platdata->chip_en);
693 /* switch off Vreg_S3 */
694 rc = regulator_disable(vreg_bq27520);
695 if (rc < 0) {
696 dev_err(di->dev, "%s: vreg %s %s failed (%d)\n",
697 __func__, platdata->vreg_name, "disable", rc);
698 goto vreg_fail;
699 }
700 }
701 return rc;
702
703irqreq_fail:
704 gpio_free(platdata->soc_int);
705gpio_fail:
706 gpio_set_value(platdata->chip_en, 0);
707 gpio_free(platdata->chip_en);
708vreg_fail:
709 ret = !enable ? regulator_enable(vreg_bq27520) :
710 regulator_disable(vreg_bq27520);
711 if (ret < 0) {
712 dev_err(di->dev, "%s: vreg %s %s failed (%d) in err path\n",
713 __func__, platdata->vreg_name,
714 !enable ? "enable" : "disable", ret);
715 }
716 return rc;
717}
718
719static int bq27520_dev_setup(bool enable, struct bq27520_device_info *di)
720{
721 int rc;
722 const struct bq27520_platform_data *platdata;
723
724 platdata = di->pdata;
725 if (enable) {
726 /* enable and set voltage Vreg_S3 */
727 vreg_bq27520 = regulator_get(NULL,
728 platdata->vreg_name);
729 if (IS_ERR(vreg_bq27520)) {
730 dev_err(di->dev, "%s: regulator get of %s\
731 failed (%ld)\n", __func__, platdata->vreg_name,
732 PTR_ERR(vreg_bq27520));
733 rc = PTR_ERR(vreg_bq27520);
734 goto vreg_get_fail;
735 }
736 rc = regulator_set_voltage(vreg_bq27520,
737 platdata->vreg_value, platdata->vreg_value);
738 if (rc) {
739 dev_err(di->dev, "%s: regulator_set_voltage(%s) failed\
740 (%d)\n", __func__, platdata->vreg_name, rc);
741 goto vreg_get_fail;
742 }
743 } else {
744 regulator_put(vreg_bq27520);
745 }
746 return 0;
747
748vreg_get_fail:
749 regulator_put(vreg_bq27520);
750 return rc;
751}
752
753static int bq27520_battery_probe(struct i2c_client *client,
754 const struct i2c_device_id *id)
755{
756 struct bq27520_device_info *di;
757 struct bq27520_access_methods *bus;
758 const struct bq27520_platform_data *pdata;
759 int num, retval = 0;
760
761 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
762 return -ENODEV;
763
764 pdata = client->dev.platform_data;
765
766 /* Get new ID for the new battery device */
767 retval = idr_pre_get(&battery_id, GFP_KERNEL);
768 if (retval == 0)
769 return -ENOMEM;
770 mutex_lock(&battery_mutex);
771 retval = idr_get_new(&battery_id, client, &num);
772 mutex_unlock(&battery_mutex);
773 if (retval < 0)
774 return retval;
775
776 di = kzalloc(sizeof(*di), GFP_KERNEL);
777 if (!di) {
778 dev_err(&client->dev, "failed to allocate device info data\n");
779 retval = -ENOMEM;
780 goto batt_failed_1;
781 }
782 di->id = num;
783 di->pdata = pdata;
784
785 bus = kzalloc(sizeof(*bus), GFP_KERNEL);
786 if (!bus) {
787 dev_err(&client->dev, "failed to allocate data\n");
788 retval = -ENOMEM;
789 goto batt_failed_2;
790 }
791
792 i2c_set_clientdata(client, di);
793 di->dev = &client->dev;
794 bus->read = &bq27520_read_i2c;
795 di->bus = bus;
796 di->client = client;
797
798#ifdef CONFIG_BQ27520_TEST_ENABLE
799 platform_set_drvdata(&this_device, di);
800 retval = platform_device_register(&this_device);
801 if (!retval) {
802 retval = sysfs_create_group(&this_device.dev.kobj,
803 &fs_attr_group);
804 if (retval)
805 goto batt_failed_3;
806 } else
807 goto batt_failed_3;
808#endif
809
810 retval = bq27520_dev_setup(true, di);
811 if (retval) {
812 dev_err(&client->dev, "failed to setup ret = %d\n", retval);
813 goto batt_failed_3;
814 }
815
816 retval = bq27520_power(true, di);
817 if (retval) {
818 dev_err(&client->dev, "failed to powerup ret = %d\n", retval);
819 goto batt_failed_3;
820 }
821
822 spin_lock_init(&lock);
823
824 bq27520_di = di;
825 if (pdata->enable_dlog)
826 INIT_WORK(&di->counter, bq27520_coulomb_counter_work);
827
828 INIT_DELAYED_WORK(&current_battery_status.poller,
829 battery_status_poller);
830 INIT_DELAYED_WORK(&di->hw_config, bq27520_hw_config);
831 schedule_delayed_work(&di->hw_config, BQ27520_INIT_DELAY);
832
833 return 0;
834
835batt_failed_3:
836 kfree(bus);
837batt_failed_2:
838 kfree(di);
839batt_failed_1:
840 mutex_lock(&battery_mutex);
841 idr_remove(&battery_id, num);
842 mutex_unlock(&battery_mutex);
843
844 return retval;
845}
846
847static int bq27520_battery_remove(struct i2c_client *client)
848{
849 struct bq27520_device_info *di = i2c_get_clientdata(client);
850
851 if (di->pdata->enable_dlog) {
852 del_timer_sync(&timer);
853 cancel_work_sync(&di->counter);
854 bq27520_cntl_cmd(di, BQ27520_SUBCMD_DISABLE_DLOG);
855 udelay(66);
856 }
857
858 bq27520_cntl_cmd(di, BQ27520_SUBCMD_DISABLE_IT);
859 cancel_delayed_work_sync(&di->hw_config);
860 cancel_delayed_work_sync(&current_battery_status.poller);
861
862 bq27520_dev_setup(false, di);
863 bq27520_power(false, di);
864
865 kfree(di->bus);
866
867 mutex_lock(&battery_mutex);
868 idr_remove(&battery_id, di->id);
869 mutex_unlock(&battery_mutex);
870
871 kfree(di);
872 return 0;
873}
874
875#ifdef CONFIG_PM
876static int bq27520_suspend(struct device *dev)
877{
878 struct bq27520_device_info *di = dev_get_drvdata(dev);
879
880 disable_irq_nosync(di->irq);
881 if (di->pdata->enable_dlog) {
882 del_timer_sync(&timer);
883 cancel_work_sync(&di->counter);
884 }
885
886 cancel_delayed_work_sync(&current_battery_status.poller);
887 return 0;
888}
889
890static int bq27520_resume(struct device *dev)
891{
892 struct bq27520_device_info *di = dev_get_drvdata(dev);
893
894 enable_irq(di->irq);
895 if (di->pdata->enable_dlog)
896 add_timer(&timer);
897
898 schedule_delayed_work(&current_battery_status.poller,
899 BQ27520_POLLING_STATUS);
900 return 0;
901}
902
903static const struct dev_pm_ops bq27520_pm_ops = {
904 .suspend = bq27520_suspend,
905 .resume = bq27520_resume,
906};
907#endif
908
909static const struct i2c_device_id bq27520_id[] = {
910 { "bq27520", 1 },
911 {},
912};
913MODULE_DEVICE_TABLE(i2c, BQ27520_id);
914
915static struct i2c_driver bq27520_battery_driver = {
916 .driver = {
917 .name = "bq27520-battery",
918 .owner = THIS_MODULE,
919#ifdef CONFIG_PM
920 .pm = &bq27520_pm_ops,
921#endif
922 },
923 .probe = bq27520_battery_probe,
924 .remove = bq27520_battery_remove,
925 .id_table = bq27520_id,
926};
927
928static void init_battery_status(void)
929{
930 spin_lock_init(&current_battery_status.lock);
931 current_battery_status.status[GET_BATTERY_STATUS] =
932 POWER_SUPPLY_STATUS_UNKNOWN;
933}
934
935static int __init bq27520_battery_init(void)
936{
937 int ret;
938
939 /* initialize current_battery_status, and register with msm-charger */
940 init_battery_status();
941 msm_battery_gauge_register(&bq27520_batt_gauge);
942
943 ret = i2c_add_driver(&bq27520_battery_driver);
944 if (ret)
945 printk(KERN_ERR "Unable to register driver ret = %d\n", ret);
946
947 return ret;
948}
949module_init(bq27520_battery_init);
950
951static void __exit bq27520_battery_exit(void)
952{
953 i2c_del_driver(&bq27520_battery_driver);
954 msm_battery_gauge_unregister(&bq27520_batt_gauge);
955}
956module_exit(bq27520_battery_exit);
957
958MODULE_LICENSE("GPL v2");
959MODULE_AUTHOR("Qualcomm Innovation Center, Inc.");
960MODULE_DESCRIPTION("BQ27520 battery monitor driver");