Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.13.7.
  1/*
  2 * Gas Gauge driver for SBS Compliant Batteries
  3 *
  4 * Copyright (c) 2010, NVIDIA Corporation.
  5 *
  6 * This program is free software; you can redistribute it and/or modify
  7 * it under the terms of the GNU General Public License as published by
  8 * the Free Software Foundation; either version 2 of the License, or
  9 * (at your option) any later version.
 10 *
 11 * This program is distributed in the hope that it will be useful, but WITHOUT
 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 14 * more details.
 15 *
 16 * You should have received a copy of the GNU General Public License along
 17 * with this program; if not, write to the Free Software Foundation, Inc.,
 18 * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 19 */
 20
 21#include <linux/init.h>
 22#include <linux/module.h>
 23#include <linux/kernel.h>
 24#include <linux/err.h>
 25#include <linux/power_supply.h>
 26#include <linux/i2c.h>
 27#include <linux/slab.h>
 28#include <linux/interrupt.h>
 29#include <linux/gpio.h>
 30#include <linux/of.h>
 31
 32#include <linux/power/sbs-battery.h>
 33
 34enum {
 35	REG_MANUFACTURER_DATA,
 36	REG_TEMPERATURE,
 37	REG_VOLTAGE,
 38	REG_CURRENT,
 39	REG_CAPACITY,
 40	REG_TIME_TO_EMPTY,
 41	REG_TIME_TO_FULL,
 42	REG_STATUS,
 43	REG_CYCLE_COUNT,
 44	REG_SERIAL_NUMBER,
 45	REG_REMAINING_CAPACITY,
 46	REG_REMAINING_CAPACITY_CHARGE,
 47	REG_FULL_CHARGE_CAPACITY,
 48	REG_FULL_CHARGE_CAPACITY_CHARGE,
 49	REG_DESIGN_CAPACITY,
 50	REG_DESIGN_CAPACITY_CHARGE,
 51	REG_DESIGN_VOLTAGE,
 52};
 53
 54/* Battery Mode defines */
 55#define BATTERY_MODE_OFFSET		0x03
 56#define BATTERY_MODE_MASK		0x8000
 57enum sbs_battery_mode {
 58	BATTERY_MODE_AMPS,
 59	BATTERY_MODE_WATTS
 60};
 61
 62/* manufacturer access defines */
 63#define MANUFACTURER_ACCESS_STATUS	0x0006
 64#define MANUFACTURER_ACCESS_SLEEP	0x0011
 65
 66/* battery status value bits */
 67#define BATTERY_DISCHARGING		0x40
 68#define BATTERY_FULL_CHARGED		0x20
 69#define BATTERY_FULL_DISCHARGED		0x10
 70
 71#define SBS_DATA(_psp, _addr, _min_value, _max_value) { \
 72	.psp = _psp, \
 73	.addr = _addr, \
 74	.min_value = _min_value, \
 75	.max_value = _max_value, \
 76}
 77
 78static const struct chip_data {
 79	enum power_supply_property psp;
 80	u8 addr;
 81	int min_value;
 82	int max_value;
 83} sbs_data[] = {
 84	[REG_MANUFACTURER_DATA] =
 85		SBS_DATA(POWER_SUPPLY_PROP_PRESENT, 0x00, 0, 65535),
 86	[REG_TEMPERATURE] =
 87		SBS_DATA(POWER_SUPPLY_PROP_TEMP, 0x08, 0, 65535),
 88	[REG_VOLTAGE] =
 89		SBS_DATA(POWER_SUPPLY_PROP_VOLTAGE_NOW, 0x09, 0, 20000),
 90	[REG_CURRENT] =
 91		SBS_DATA(POWER_SUPPLY_PROP_CURRENT_NOW, 0x0A, -32768, 32767),
 92	[REG_CAPACITY] =
 93		SBS_DATA(POWER_SUPPLY_PROP_CAPACITY, 0x0D, 0, 100),
 94	[REG_REMAINING_CAPACITY] =
 95		SBS_DATA(POWER_SUPPLY_PROP_ENERGY_NOW, 0x0F, 0, 65535),
 96	[REG_REMAINING_CAPACITY_CHARGE] =
 97		SBS_DATA(POWER_SUPPLY_PROP_CHARGE_NOW, 0x0F, 0, 65535),
 98	[REG_FULL_CHARGE_CAPACITY] =
 99		SBS_DATA(POWER_SUPPLY_PROP_ENERGY_FULL, 0x10, 0, 65535),
100	[REG_FULL_CHARGE_CAPACITY_CHARGE] =
101		SBS_DATA(POWER_SUPPLY_PROP_CHARGE_FULL, 0x10, 0, 65535),
102	[REG_TIME_TO_EMPTY] =
103		SBS_DATA(POWER_SUPPLY_PROP_TIME_TO_EMPTY_AVG, 0x12, 0, 65535),
104	[REG_TIME_TO_FULL] =
105		SBS_DATA(POWER_SUPPLY_PROP_TIME_TO_FULL_AVG, 0x13, 0, 65535),
106	[REG_STATUS] =
107		SBS_DATA(POWER_SUPPLY_PROP_STATUS, 0x16, 0, 65535),
108	[REG_CYCLE_COUNT] =
109		SBS_DATA(POWER_SUPPLY_PROP_CYCLE_COUNT, 0x17, 0, 65535),
110	[REG_DESIGN_CAPACITY] =
111		SBS_DATA(POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN, 0x18, 0, 65535),
112	[REG_DESIGN_CAPACITY_CHARGE] =
113		SBS_DATA(POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, 0x18, 0, 65535),
114	[REG_DESIGN_VOLTAGE] =
115		SBS_DATA(POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN, 0x19, 0, 65535),
116	[REG_SERIAL_NUMBER] =
117		SBS_DATA(POWER_SUPPLY_PROP_SERIAL_NUMBER, 0x1C, 0, 65535),
118};
119
120static enum power_supply_property sbs_properties[] = {
121	POWER_SUPPLY_PROP_STATUS,
122	POWER_SUPPLY_PROP_HEALTH,
123	POWER_SUPPLY_PROP_PRESENT,
124	POWER_SUPPLY_PROP_TECHNOLOGY,
125	POWER_SUPPLY_PROP_CYCLE_COUNT,
126	POWER_SUPPLY_PROP_VOLTAGE_NOW,
127	POWER_SUPPLY_PROP_CURRENT_NOW,
128	POWER_SUPPLY_PROP_CAPACITY,
129	POWER_SUPPLY_PROP_TEMP,
130	POWER_SUPPLY_PROP_TIME_TO_EMPTY_AVG,
131	POWER_SUPPLY_PROP_TIME_TO_FULL_AVG,
132	POWER_SUPPLY_PROP_SERIAL_NUMBER,
133	POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN,
134	POWER_SUPPLY_PROP_ENERGY_NOW,
135	POWER_SUPPLY_PROP_ENERGY_FULL,
136	POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN,
137	POWER_SUPPLY_PROP_CHARGE_NOW,
138	POWER_SUPPLY_PROP_CHARGE_FULL,
139	POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
140};
141
142struct sbs_info {
143	struct i2c_client		*client;
144	struct power_supply		power_supply;
145	struct sbs_platform_data	*pdata;
146	bool				is_present;
147	bool				gpio_detect;
148	bool				enable_detection;
149	int				irq;
150	int				last_state;
151	int				poll_time;
152	struct delayed_work		work;
153	int				ignore_changes;
154};
155
156static int sbs_read_word_data(struct i2c_client *client, u8 address)
157{
158	struct sbs_info *chip = i2c_get_clientdata(client);
159	s32 ret = 0;
160	int retries = 1;
161
162	if (chip->pdata)
163		retries = max(chip->pdata->i2c_retry_count + 1, 1);
164
165	while (retries > 0) {
166		ret = i2c_smbus_read_word_data(client, address);
167		if (ret >= 0)
168			break;
169		retries--;
170	}
171
172	if (ret < 0) {
173		dev_dbg(&client->dev,
174			"%s: i2c read at address 0x%x failed\n",
175			__func__, address);
176		return ret;
177	}
178
179	return le16_to_cpu(ret);
180}
181
182static int sbs_write_word_data(struct i2c_client *client, u8 address,
183	u16 value)
184{
185	struct sbs_info *chip = i2c_get_clientdata(client);
186	s32 ret = 0;
187	int retries = 1;
188
189	if (chip->pdata)
190		retries = max(chip->pdata->i2c_retry_count + 1, 1);
191
192	while (retries > 0) {
193		ret = i2c_smbus_write_word_data(client, address,
194			le16_to_cpu(value));
195		if (ret >= 0)
196			break;
197		retries--;
198	}
199
200	if (ret < 0) {
201		dev_dbg(&client->dev,
202			"%s: i2c write to address 0x%x failed\n",
203			__func__, address);
204		return ret;
205	}
206
207	return 0;
208}
209
210static int sbs_get_battery_presence_and_health(
211	struct i2c_client *client, enum power_supply_property psp,
212	union power_supply_propval *val)
213{
214	s32 ret;
215	struct sbs_info *chip = i2c_get_clientdata(client);
216
217	if (psp == POWER_SUPPLY_PROP_PRESENT &&
218		chip->gpio_detect) {
219		ret = gpio_get_value(chip->pdata->battery_detect);
220		if (ret == chip->pdata->battery_detect_present)
221			val->intval = 1;
222		else
223			val->intval = 0;
224		chip->is_present = val->intval;
225		return ret;
226	}
227
228	/* Write to ManufacturerAccess with
229	 * ManufacturerAccess command and then
230	 * read the status */
231	ret = sbs_write_word_data(client, sbs_data[REG_MANUFACTURER_DATA].addr,
232					MANUFACTURER_ACCESS_STATUS);
233	if (ret < 0) {
234		if (psp == POWER_SUPPLY_PROP_PRESENT)
235			val->intval = 0; /* battery removed */
236		return ret;
237	}
238
239	ret = sbs_read_word_data(client, sbs_data[REG_MANUFACTURER_DATA].addr);
240	if (ret < 0)
241		return ret;
242
243	if (ret < sbs_data[REG_MANUFACTURER_DATA].min_value ||
244	    ret > sbs_data[REG_MANUFACTURER_DATA].max_value) {
245		val->intval = 0;
246		return 0;
247	}
248
249	/* Mask the upper nibble of 2nd byte and
250	 * lower byte of response then
251	 * shift the result by 8 to get status*/
252	ret &= 0x0F00;
253	ret >>= 8;
254	if (psp == POWER_SUPPLY_PROP_PRESENT) {
255		if (ret == 0x0F)
256			/* battery removed */
257			val->intval = 0;
258		else
259			val->intval = 1;
260	} else if (psp == POWER_SUPPLY_PROP_HEALTH) {
261		if (ret == 0x09)
262			val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
263		else if (ret == 0x0B)
264			val->intval = POWER_SUPPLY_HEALTH_OVERHEAT;
265		else if (ret == 0x0C)
266			val->intval = POWER_SUPPLY_HEALTH_DEAD;
267		else
268			val->intval = POWER_SUPPLY_HEALTH_GOOD;
269	}
270
271	return 0;
272}
273
274static int sbs_get_battery_property(struct i2c_client *client,
275	int reg_offset, enum power_supply_property psp,
276	union power_supply_propval *val)
277{
278	struct sbs_info *chip = i2c_get_clientdata(client);
279	s32 ret;
280
281	ret = sbs_read_word_data(client, sbs_data[reg_offset].addr);
282	if (ret < 0)
283		return ret;
284
285	/* returned values are 16 bit */
286	if (sbs_data[reg_offset].min_value < 0)
287		ret = (s16)ret;
288
289	if (ret >= sbs_data[reg_offset].min_value &&
290	    ret <= sbs_data[reg_offset].max_value) {
291		val->intval = ret;
292		if (psp != POWER_SUPPLY_PROP_STATUS)
293			return 0;
294
295		if (ret & BATTERY_FULL_CHARGED)
296			val->intval = POWER_SUPPLY_STATUS_FULL;
297		else if (ret & BATTERY_FULL_DISCHARGED)
298			val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
299		else if (ret & BATTERY_DISCHARGING)
300			val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
301		else
302			val->intval = POWER_SUPPLY_STATUS_CHARGING;
303
304		if (chip->poll_time == 0)
305			chip->last_state = val->intval;
306		else if (chip->last_state != val->intval) {
307			cancel_delayed_work_sync(&chip->work);
308			power_supply_changed(&chip->power_supply);
309			chip->poll_time = 0;
310		}
311	} else {
312		if (psp == POWER_SUPPLY_PROP_STATUS)
313			val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
314		else
315			val->intval = 0;
316	}
317
318	return 0;
319}
320
321static void  sbs_unit_adjustment(struct i2c_client *client,
322	enum power_supply_property psp, union power_supply_propval *val)
323{
324#define BASE_UNIT_CONVERSION		1000
325#define BATTERY_MODE_CAP_MULT_WATT	(10 * BASE_UNIT_CONVERSION)
326#define TIME_UNIT_CONVERSION		60
327#define TEMP_KELVIN_TO_CELSIUS		2731
328	switch (psp) {
329	case POWER_SUPPLY_PROP_ENERGY_NOW:
330	case POWER_SUPPLY_PROP_ENERGY_FULL:
331	case POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN:
332		/* sbs provides energy in units of 10mWh.
333		 * Convert to µWh
334		 */
335		val->intval *= BATTERY_MODE_CAP_MULT_WATT;
336		break;
337
338	case POWER_SUPPLY_PROP_VOLTAGE_NOW:
339	case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN:
340	case POWER_SUPPLY_PROP_CURRENT_NOW:
341	case POWER_SUPPLY_PROP_CHARGE_NOW:
342	case POWER_SUPPLY_PROP_CHARGE_FULL:
343	case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
344		val->intval *= BASE_UNIT_CONVERSION;
345		break;
346
347	case POWER_SUPPLY_PROP_TEMP:
348		/* sbs provides battery temperature in 0.1K
349		 * so convert it to 0.1°C
350		 */
351		val->intval -= TEMP_KELVIN_TO_CELSIUS;
352		break;
353
354	case POWER_SUPPLY_PROP_TIME_TO_EMPTY_AVG:
355	case POWER_SUPPLY_PROP_TIME_TO_FULL_AVG:
356		/* sbs provides time to empty and time to full in minutes.
357		 * Convert to seconds
358		 */
359		val->intval *= TIME_UNIT_CONVERSION;
360		break;
361
362	default:
363		dev_dbg(&client->dev,
364			"%s: no need for unit conversion %d\n", __func__, psp);
365	}
366}
367
368static enum sbs_battery_mode sbs_set_battery_mode(struct i2c_client *client,
369	enum sbs_battery_mode mode)
370{
371	int ret, original_val;
372
373	original_val = sbs_read_word_data(client, BATTERY_MODE_OFFSET);
374	if (original_val < 0)
375		return original_val;
376
377	if ((original_val & BATTERY_MODE_MASK) == mode)
378		return mode;
379
380	if (mode == BATTERY_MODE_AMPS)
381		ret = original_val & ~BATTERY_MODE_MASK;
382	else
383		ret = original_val | BATTERY_MODE_MASK;
384
385	ret = sbs_write_word_data(client, BATTERY_MODE_OFFSET, ret);
386	if (ret < 0)
387		return ret;
388
389	return original_val & BATTERY_MODE_MASK;
390}
391
392static int sbs_get_battery_capacity(struct i2c_client *client,
393	int reg_offset, enum power_supply_property psp,
394	union power_supply_propval *val)
395{
396	s32 ret;
397	enum sbs_battery_mode mode = BATTERY_MODE_WATTS;
398
399	if (power_supply_is_amp_property(psp))
400		mode = BATTERY_MODE_AMPS;
401
402	mode = sbs_set_battery_mode(client, mode);
403	if (mode < 0)
404		return mode;
405
406	ret = sbs_read_word_data(client, sbs_data[reg_offset].addr);
407	if (ret < 0)
408		return ret;
409
410	if (psp == POWER_SUPPLY_PROP_CAPACITY) {
411		/* sbs spec says that this can be >100 %
412		* even if max value is 100 % */
413		val->intval = min(ret, 100);
414	} else
415		val->intval = ret;
416
417	ret = sbs_set_battery_mode(client, mode);
418	if (ret < 0)
419		return ret;
420
421	return 0;
422}
423
424static char sbs_serial[5];
425static int sbs_get_battery_serial_number(struct i2c_client *client,
426	union power_supply_propval *val)
427{
428	int ret;
429
430	ret = sbs_read_word_data(client, sbs_data[REG_SERIAL_NUMBER].addr);
431	if (ret < 0)
432		return ret;
433
434	ret = sprintf(sbs_serial, "%04x", ret);
435	val->strval = sbs_serial;
436
437	return 0;
438}
439
440static int sbs_get_property_index(struct i2c_client *client,
441	enum power_supply_property psp)
442{
443	int count;
444	for (count = 0; count < ARRAY_SIZE(sbs_data); count++)
445		if (psp == sbs_data[count].psp)
446			return count;
447
448	dev_warn(&client->dev,
449		"%s: Invalid Property - %d\n", __func__, psp);
450
451	return -EINVAL;
452}
453
454static int sbs_get_property(struct power_supply *psy,
455	enum power_supply_property psp,
456	union power_supply_propval *val)
457{
458	int ret = 0;
459	struct sbs_info *chip = container_of(psy,
460				struct sbs_info, power_supply);
461	struct i2c_client *client = chip->client;
462
463	switch (psp) {
464	case POWER_SUPPLY_PROP_PRESENT:
465	case POWER_SUPPLY_PROP_HEALTH:
466		ret = sbs_get_battery_presence_and_health(client, psp, val);
467		if (psp == POWER_SUPPLY_PROP_PRESENT)
468			return 0;
469		break;
470
471	case POWER_SUPPLY_PROP_TECHNOLOGY:
472		val->intval = POWER_SUPPLY_TECHNOLOGY_LION;
473		goto done; /* don't trigger power_supply_changed()! */
474
475	case POWER_SUPPLY_PROP_ENERGY_NOW:
476	case POWER_SUPPLY_PROP_ENERGY_FULL:
477	case POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN:
478	case POWER_SUPPLY_PROP_CHARGE_NOW:
479	case POWER_SUPPLY_PROP_CHARGE_FULL:
480	case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
481	case POWER_SUPPLY_PROP_CAPACITY:
482		ret = sbs_get_property_index(client, psp);
483		if (ret < 0)
484			break;
485
486		ret = sbs_get_battery_capacity(client, ret, psp, val);
487		break;
488
489	case POWER_SUPPLY_PROP_SERIAL_NUMBER:
490		ret = sbs_get_battery_serial_number(client, val);
491		break;
492
493	case POWER_SUPPLY_PROP_STATUS:
494	case POWER_SUPPLY_PROP_CYCLE_COUNT:
495	case POWER_SUPPLY_PROP_VOLTAGE_NOW:
496	case POWER_SUPPLY_PROP_CURRENT_NOW:
497	case POWER_SUPPLY_PROP_TEMP:
498	case POWER_SUPPLY_PROP_TIME_TO_EMPTY_AVG:
499	case POWER_SUPPLY_PROP_TIME_TO_FULL_AVG:
500	case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN:
501		ret = sbs_get_property_index(client, psp);
502		if (ret < 0)
503			break;
504
505		ret = sbs_get_battery_property(client, ret, psp, val);
506		break;
507
508	default:
509		dev_err(&client->dev,
510			"%s: INVALID property\n", __func__);
511		return -EINVAL;
512	}
513
514	if (!chip->enable_detection)
515		goto done;
516
517	if (!chip->gpio_detect &&
518		chip->is_present != (ret >= 0)) {
519		chip->is_present = (ret >= 0);
520		power_supply_changed(&chip->power_supply);
521	}
522
523done:
524	if (!ret) {
525		/* Convert units to match requirements for power supply class */
526		sbs_unit_adjustment(client, psp, val);
527	}
528
529	dev_dbg(&client->dev,
530		"%s: property = %d, value = %x\n", __func__, psp, val->intval);
531
532	if (ret && chip->is_present)
533		return ret;
534
535	/* battery not present, so return NODATA for properties */
536	if (ret)
537		return -ENODATA;
538
539	return 0;
540}
541
542static irqreturn_t sbs_irq(int irq, void *devid)
543{
544	struct power_supply *battery = devid;
545
546	power_supply_changed(battery);
547
548	return IRQ_HANDLED;
549}
550
551static void sbs_external_power_changed(struct power_supply *psy)
552{
553	struct sbs_info *chip;
554
555	chip = container_of(psy, struct sbs_info, power_supply);
556
557	if (chip->ignore_changes > 0) {
558		chip->ignore_changes--;
559		return;
560	}
561
562	/* cancel outstanding work */
563	cancel_delayed_work_sync(&chip->work);
564
565	schedule_delayed_work(&chip->work, HZ);
566	chip->poll_time = chip->pdata->poll_retry_count;
567}
568
569static void sbs_delayed_work(struct work_struct *work)
570{
571	struct sbs_info *chip;
572	s32 ret;
573
574	chip = container_of(work, struct sbs_info, work.work);
575
576	ret = sbs_read_word_data(chip->client, sbs_data[REG_STATUS].addr);
577	/* if the read failed, give up on this work */
578	if (ret < 0) {
579		chip->poll_time = 0;
580		return;
581	}
582
583	if (ret & BATTERY_FULL_CHARGED)
584		ret = POWER_SUPPLY_STATUS_FULL;
585	else if (ret & BATTERY_FULL_DISCHARGED)
586		ret = POWER_SUPPLY_STATUS_NOT_CHARGING;
587	else if (ret & BATTERY_DISCHARGING)
588		ret = POWER_SUPPLY_STATUS_DISCHARGING;
589	else
590		ret = POWER_SUPPLY_STATUS_CHARGING;
591
592	if (chip->last_state != ret) {
593		chip->poll_time = 0;
594		power_supply_changed(&chip->power_supply);
595		return;
596	}
597	if (chip->poll_time > 0) {
598		schedule_delayed_work(&chip->work, HZ);
599		chip->poll_time--;
600		return;
601	}
602}
603
604#if defined(CONFIG_OF)
605
606#include <linux/of_device.h>
607#include <linux/of_gpio.h>
608
609static const struct of_device_id sbs_dt_ids[] = {
610	{ .compatible = "sbs,sbs-battery" },
611	{ .compatible = "ti,bq20z75" },
612	{ }
613};
614MODULE_DEVICE_TABLE(of, sbs_dt_ids);
615
616static struct sbs_platform_data *sbs_of_populate_pdata(
617		struct i2c_client *client)
618{
619	struct device_node *of_node = client->dev.of_node;
620	struct sbs_platform_data *pdata = client->dev.platform_data;
621	enum of_gpio_flags gpio_flags;
622	int rc;
623	u32 prop;
624
625	/* verify this driver matches this device */
626	if (!of_node)
627		return NULL;
628
629	/* if platform data is set, honor it */
630	if (pdata)
631		return pdata;
632
633	/* first make sure at least one property is set, otherwise
634	 * it won't change behavior from running without pdata.
635	 */
636	if (!of_get_property(of_node, "sbs,i2c-retry-count", NULL) &&
637		!of_get_property(of_node, "sbs,poll-retry-count", NULL) &&
638		!of_get_property(of_node, "sbs,battery-detect-gpios", NULL))
639		goto of_out;
640
641	pdata = devm_kzalloc(&client->dev, sizeof(struct sbs_platform_data),
642				GFP_KERNEL);
643	if (!pdata)
644		goto of_out;
645
646	rc = of_property_read_u32(of_node, "sbs,i2c-retry-count", &prop);
647	if (!rc)
648		pdata->i2c_retry_count = prop;
649
650	rc = of_property_read_u32(of_node, "sbs,poll-retry-count", &prop);
651	if (!rc)
652		pdata->poll_retry_count = prop;
653
654	if (!of_get_property(of_node, "sbs,battery-detect-gpios", NULL)) {
655		pdata->battery_detect = -1;
656		goto of_out;
657	}
658
659	pdata->battery_detect = of_get_named_gpio_flags(of_node,
660			"sbs,battery-detect-gpios", 0, &gpio_flags);
661
662	if (gpio_flags & OF_GPIO_ACTIVE_LOW)
663		pdata->battery_detect_present = 0;
664	else
665		pdata->battery_detect_present = 1;
666
667of_out:
668	return pdata;
669}
670#else
671static struct sbs_platform_data *sbs_of_populate_pdata(
672	struct i2c_client *client)
673{
674	return client->dev.platform_data;
675}
676#endif
677
678static int sbs_probe(struct i2c_client *client,
679	const struct i2c_device_id *id)
680{
681	struct sbs_info *chip;
682	struct sbs_platform_data *pdata = client->dev.platform_data;
683	int rc;
684	int irq;
685	char *name;
686
687	name = kasprintf(GFP_KERNEL, "sbs-%s", dev_name(&client->dev));
688	if (!name) {
689		dev_err(&client->dev, "Failed to allocate device name\n");
690		return -ENOMEM;
691	}
692
693	chip = kzalloc(sizeof(struct sbs_info), GFP_KERNEL);
694	if (!chip) {
695		rc = -ENOMEM;
696		goto exit_free_name;
697	}
698
699	chip->client = client;
700	chip->enable_detection = false;
701	chip->gpio_detect = false;
702	chip->power_supply.name = name;
703	chip->power_supply.type = POWER_SUPPLY_TYPE_BATTERY;
704	chip->power_supply.properties = sbs_properties;
705	chip->power_supply.num_properties = ARRAY_SIZE(sbs_properties);
706	chip->power_supply.get_property = sbs_get_property;
707	chip->power_supply.of_node = client->dev.of_node;
708	/* ignore first notification of external change, it is generated
709	 * from the power_supply_register call back
710	 */
711	chip->ignore_changes = 1;
712	chip->last_state = POWER_SUPPLY_STATUS_UNKNOWN;
713	chip->power_supply.external_power_changed = sbs_external_power_changed;
714
715	pdata = sbs_of_populate_pdata(client);
716
717	if (pdata) {
718		chip->gpio_detect = gpio_is_valid(pdata->battery_detect);
719		chip->pdata = pdata;
720	}
721
722	i2c_set_clientdata(client, chip);
723
724	if (!chip->gpio_detect)
725		goto skip_gpio;
726
727	rc = gpio_request(pdata->battery_detect, dev_name(&client->dev));
728	if (rc) {
729		dev_warn(&client->dev, "Failed to request gpio: %d\n", rc);
730		chip->gpio_detect = false;
731		goto skip_gpio;
732	}
733
734	rc = gpio_direction_input(pdata->battery_detect);
735	if (rc) {
736		dev_warn(&client->dev, "Failed to get gpio as input: %d\n", rc);
737		gpio_free(pdata->battery_detect);
738		chip->gpio_detect = false;
739		goto skip_gpio;
740	}
741
742	irq = gpio_to_irq(pdata->battery_detect);
743	if (irq <= 0) {
744		dev_warn(&client->dev, "Failed to get gpio as irq: %d\n", irq);
745		gpio_free(pdata->battery_detect);
746		chip->gpio_detect = false;
747		goto skip_gpio;
748	}
749
750	rc = request_irq(irq, sbs_irq,
751		IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
752		dev_name(&client->dev), &chip->power_supply);
753	if (rc) {
754		dev_warn(&client->dev, "Failed to request irq: %d\n", rc);
755		gpio_free(pdata->battery_detect);
756		chip->gpio_detect = false;
757		goto skip_gpio;
758	}
759
760	chip->irq = irq;
761
762skip_gpio:
763	/*
764	 * Before we register, we need to make sure we can actually talk
765	 * to the battery.
766	 */
767	rc = sbs_read_word_data(client, sbs_data[REG_STATUS].addr);
768	if (rc < 0) {
769		dev_err(&client->dev, "%s: Failed to get device status\n",
770			__func__);
771		goto exit_psupply;
772	}
773
774	rc = power_supply_register(&client->dev, &chip->power_supply);
775	if (rc) {
776		dev_err(&client->dev,
777			"%s: Failed to register power supply\n", __func__);
778		goto exit_psupply;
779	}
780
781	dev_info(&client->dev,
782		"%s: battery gas gauge device registered\n", client->name);
783
784	INIT_DELAYED_WORK(&chip->work, sbs_delayed_work);
785
786	chip->enable_detection = true;
787
788	return 0;
789
790exit_psupply:
791	if (chip->irq)
792		free_irq(chip->irq, &chip->power_supply);
793	if (chip->gpio_detect)
794		gpio_free(pdata->battery_detect);
795
796	kfree(chip);
797
798exit_free_name:
799	kfree(name);
800
801	return rc;
802}
803
804static int sbs_remove(struct i2c_client *client)
805{
806	struct sbs_info *chip = i2c_get_clientdata(client);
807
808	if (chip->irq)
809		free_irq(chip->irq, &chip->power_supply);
810	if (chip->gpio_detect)
811		gpio_free(chip->pdata->battery_detect);
812
813	power_supply_unregister(&chip->power_supply);
814
815	cancel_delayed_work_sync(&chip->work);
816
817	kfree(chip->power_supply.name);
818	kfree(chip);
819	chip = NULL;
820
821	return 0;
822}
823
824#if defined CONFIG_PM_SLEEP
825
826static int sbs_suspend(struct device *dev)
827{
828	struct i2c_client *client = to_i2c_client(dev);
829	struct sbs_info *chip = i2c_get_clientdata(client);
830	s32 ret;
831
832	if (chip->poll_time > 0)
833		cancel_delayed_work_sync(&chip->work);
834
835	/* write to manufacturer access with sleep command */
836	ret = sbs_write_word_data(client, sbs_data[REG_MANUFACTURER_DATA].addr,
837		MANUFACTURER_ACCESS_SLEEP);
838	if (chip->is_present && ret < 0)
839		return ret;
840
841	return 0;
842}
843
844static SIMPLE_DEV_PM_OPS(sbs_pm_ops, sbs_suspend, NULL);
845#define SBS_PM_OPS (&sbs_pm_ops)
846
847#else
848#define SBS_PM_OPS NULL
849#endif
850
851static const struct i2c_device_id sbs_id[] = {
852	{ "bq20z75", 0 },
853	{ "sbs-battery", 1 },
854	{}
855};
856MODULE_DEVICE_TABLE(i2c, sbs_id);
857
858static struct i2c_driver sbs_battery_driver = {
859	.probe		= sbs_probe,
860	.remove		= sbs_remove,
861	.id_table	= sbs_id,
862	.driver = {
863		.name	= "sbs-battery",
864		.of_match_table = of_match_ptr(sbs_dt_ids),
865		.pm	= SBS_PM_OPS,
866	},
867};
868module_i2c_driver(sbs_battery_driver);
869
870MODULE_DESCRIPTION("SBS battery monitor driver");
871MODULE_LICENSE("GPL");