22 #include <linux/module.h>
23 #include <linux/kernel.h>
26 #include <linux/i2c.h>
27 #include <linux/slab.h>
54 #define BATTERY_MODE_OFFSET 0x03
55 #define BATTERY_MODE_MASK 0x8000
62 #define MANUFACTURER_ACCESS_STATUS 0x0006
63 #define MANUFACTURER_ACCESS_SLEEP 0x0011
66 #define BATTERY_DISCHARGING 0x40
67 #define BATTERY_FULL_CHARGED 0x20
68 #define BATTERY_FULL_DISCHARGED 0x10
70 #define SBS_DATA(_psp, _addr, _min_value, _max_value) { \
73 .min_value = _min_value, \
74 .max_value = _max_value, \
77 static const struct chip_data {
162 retries =
max(chip->
pdata->i2c_retry_count + 1, 1);
164 while (retries > 0) {
173 "%s: i2c read at address 0x%x failed\n",
181 static int sbs_write_word_data(
struct i2c_client *client,
u8 address,
184 struct sbs_info *chip = i2c_get_clientdata(client);
189 retries =
max(chip->
pdata->i2c_retry_count + 1, 1);
191 while (retries > 0) {
201 "%s: i2c write to address 0x%x failed\n",
209 static int sbs_get_battery_presence_and_health(
214 struct sbs_info *chip = i2c_get_clientdata(client);
219 if (ret == chip->
pdata->battery_detect_present)
262 else if (ret == 0x0B)
264 else if (ret == 0x0C)
273 static int sbs_get_battery_property(
struct i2c_client *client,
277 struct sbs_info *chip = i2c_get_clientdata(client);
280 ret = sbs_read_word_data(client, sbs_data[reg_offset].
addr);
285 if (sbs_data[reg_offset].min_value < 0)
288 if (ret >= sbs_data[reg_offset].min_value &&
289 ret <= sbs_data[reg_offset].max_value) {
320 static void sbs_unit_adjustment(
struct i2c_client *client,
323 #define BASE_UNIT_CONVERSION 1000
324 #define BATTERY_MODE_CAP_MULT_WATT (10 * BASE_UNIT_CONVERSION)
325 #define TIME_UNIT_CONVERSION 60
326 #define TEMP_KELVIN_TO_CELSIUS 2731
363 "%s: no need for unit conversion %d\n", __func__, psp);
370 int ret, original_val;
373 if (original_val < 0)
380 ret = original_val & ~BATTERY_MODE_MASK;
391 static int sbs_get_battery_capacity(
struct i2c_client *client,
398 if (power_supply_is_amp_property(psp))
401 mode = sbs_set_battery_mode(client, mode);
405 ret = sbs_read_word_data(client, sbs_data[reg_offset].
addr);
416 ret = sbs_set_battery_mode(client, mode);
423 static char sbs_serial[5];
424 static int sbs_get_battery_serial_number(
struct i2c_client *client,
433 ret =
sprintf(sbs_serial,
"%04x", ret);
439 static int sbs_get_property_index(
struct i2c_client *client,
443 for (count = 0; count <
ARRAY_SIZE(sbs_data); count++)
444 if (psp == sbs_data[count].psp)
448 "%s: Invalid Property - %d\n", __func__, psp);
465 ret = sbs_get_battery_presence_and_health(client, psp, val);
481 ret = sbs_get_property_index(client, psp);
485 ret = sbs_get_battery_capacity(client, ret, psp, val);
489 ret = sbs_get_battery_serial_number(client, val);
500 ret = sbs_get_property_index(client, psp);
504 ret = sbs_get_battery_property(client, ret, psp, val);
509 "%s: INVALID property\n", __func__);
525 sbs_unit_adjustment(client, psp, val);
529 "%s: property = %d, value = %x\n", __func__, psp, val->
intval);
550 static void sbs_external_power_changed(
struct power_supply *psy)
582 if (ret & BATTERY_FULL_CHARGED)
584 else if (ret & BATTERY_FULL_DISCHARGED)
586 else if (ret & BATTERY_DISCHARGING)
603 #if defined(CONFIG_OF)
609 { .compatible =
"sbs,sbs-battery" },
610 { .compatible =
"ti,bq20z75" },
645 rc = of_property_read_u32(of_node,
"sbs,i2c-retry-count", &prop);
649 rc = of_property_read_u32(of_node,
"sbs,poll-retry-count", &prop);
659 "sbs,battery-detect-gpios", 0, &gpio_flags);
670 #define sbs_dt_ids NULL
674 return client->
dev.platform_data;
689 dev_err(&client->
dev,
"Failed to allocate device name\n");
712 chip->
power_supply.external_power_changed = sbs_external_power_changed;
714 pdata = sbs_of_populate_pdata(client);
721 i2c_set_clientdata(client, chip);
728 dev_warn(&client->
dev,
"Failed to request gpio: %d\n", rc);
735 dev_warn(&client->
dev,
"Failed to get gpio as input: %d\n", rc);
743 dev_warn(&client->
dev,
"Failed to get gpio as irq: %d\n", irq);
753 dev_warn(&client->
dev,
"Failed to request irq: %d\n", rc);
768 dev_err(&client->
dev,
"%s: Failed to get device status\n",
776 "%s: Failed to register power supply\n", __func__);
781 "%s: battery gas gauge device registered\n", client->
name);
805 struct sbs_info *chip = i2c_get_clientdata(client);
823 #if defined CONFIG_PM
827 struct sbs_info *chip = i2c_get_clientdata(client);
842 #define sbs_suspend NULL
845 #define sbs_resume NULL
849 {
"sbs-battery", 1 },
854 static struct i2c_driver sbs_battery_driver = {
861 .
name =
"sbs-battery",