ltc2941-battery-gauge.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553
  1. /*
  2. * I2C client/driver for the Linear Technology LTC2941 and LTC2943
  3. * Battery Gas Gauge IC
  4. *
  5. * Copyright (C) 2014 Topic Embedded Systems
  6. *
  7. * Author: Auryn Verwegen
  8. * Author: Mike Looijmans
  9. */
  10. #include <linux/kernel.h>
  11. #include <linux/module.h>
  12. #include <linux/types.h>
  13. #include <linux/errno.h>
  14. #include <linux/swab.h>
  15. #include <linux/i2c.h>
  16. #include <linux/delay.h>
  17. #include <linux/idr.h>
  18. #include <linux/power_supply.h>
  19. #include <linux/slab.h>
  20. #define I16_MSB(x) ((x >> 8) & 0xFF)
  21. #define I16_LSB(x) (x & 0xFF)
  22. #define LTC294X_WORK_DELAY 10 /* Update delay in seconds */
  23. #define LTC294X_MAX_VALUE 0xFFFF
  24. #define LTC294X_MID_SUPPLY 0x7FFF
  25. #define LTC2941_MAX_PRESCALER_EXP 7
  26. #define LTC2943_MAX_PRESCALER_EXP 6
  27. enum ltc294x_reg {
  28. LTC294X_REG_STATUS = 0x00,
  29. LTC294X_REG_CONTROL = 0x01,
  30. LTC294X_REG_ACC_CHARGE_MSB = 0x02,
  31. LTC294X_REG_ACC_CHARGE_LSB = 0x03,
  32. LTC294X_REG_THRESH_HIGH_MSB = 0x04,
  33. LTC294X_REG_THRESH_HIGH_LSB = 0x05,
  34. LTC294X_REG_THRESH_LOW_MSB = 0x06,
  35. LTC294X_REG_THRESH_LOW_LSB = 0x07,
  36. LTC294X_REG_VOLTAGE_MSB = 0x08,
  37. LTC294X_REG_VOLTAGE_LSB = 0x09,
  38. LTC294X_REG_CURRENT_MSB = 0x0E,
  39. LTC294X_REG_CURRENT_LSB = 0x0F,
  40. LTC294X_REG_TEMPERATURE_MSB = 0x14,
  41. LTC294X_REG_TEMPERATURE_LSB = 0x15,
  42. };
  43. #define LTC2943_REG_CONTROL_MODE_MASK (BIT(7) | BIT(6))
  44. #define LTC2943_REG_CONTROL_MODE_SCAN BIT(7)
  45. #define LTC294X_REG_CONTROL_PRESCALER_MASK (BIT(5) | BIT(4) | BIT(3))
  46. #define LTC294X_REG_CONTROL_SHUTDOWN_MASK (BIT(0))
  47. #define LTC294X_REG_CONTROL_PRESCALER_SET(x) \
  48. ((x << 3) & LTC294X_REG_CONTROL_PRESCALER_MASK)
  49. #define LTC294X_REG_CONTROL_ALCC_CONFIG_DISABLED 0
  50. #define LTC2941_NUM_REGS 0x08
  51. #define LTC2943_NUM_REGS 0x18
  52. struct ltc294x_info {
  53. struct i2c_client *client; /* I2C Client pointer */
  54. struct power_supply *supply; /* Supply pointer */
  55. struct power_supply_desc supply_desc; /* Supply description */
  56. struct delayed_work work; /* Work scheduler */
  57. int num_regs; /* Number of registers (chip type) */
  58. int id; /* Identifier of ltc294x chip */
  59. int charge; /* Last charge register content */
  60. int r_sense; /* mOhm */
  61. int Qlsb; /* nAh */
  62. };
  63. static DEFINE_IDR(ltc294x_id);
  64. static DEFINE_MUTEX(ltc294x_lock);
  65. static inline int convert_bin_to_uAh(
  66. const struct ltc294x_info *info, int Q)
  67. {
  68. return ((Q * (info->Qlsb / 10))) / 100;
  69. }
  70. static inline int convert_uAh_to_bin(
  71. const struct ltc294x_info *info, int uAh)
  72. {
  73. int Q;
  74. Q = (uAh * 100) / (info->Qlsb/10);
  75. return (Q < LTC294X_MAX_VALUE) ? Q : LTC294X_MAX_VALUE;
  76. }
  77. static int ltc294x_read_regs(struct i2c_client *client,
  78. enum ltc294x_reg reg, u8 *buf, int num_regs)
  79. {
  80. int ret;
  81. struct i2c_msg msgs[2] = { };
  82. u8 reg_start = reg;
  83. msgs[0].addr = client->addr;
  84. msgs[0].len = 1;
  85. msgs[0].buf = &reg_start;
  86. msgs[1].addr = client->addr;
  87. msgs[1].len = num_regs;
  88. msgs[1].buf = buf;
  89. msgs[1].flags = I2C_M_RD;
  90. ret = i2c_transfer(client->adapter, &msgs[0], 2);
  91. if (ret < 0) {
  92. dev_err(&client->dev, "ltc2941 read_reg failed!\n");
  93. return ret;
  94. }
  95. dev_dbg(&client->dev, "%s (%#x, %d) -> %#x\n",
  96. __func__, reg, num_regs, *buf);
  97. return 0;
  98. }
  99. static int ltc294x_write_regs(struct i2c_client *client,
  100. enum ltc294x_reg reg, const u8 *buf, int num_regs)
  101. {
  102. int ret;
  103. u8 reg_start = reg;
  104. ret = i2c_smbus_write_i2c_block_data(client, reg_start, num_regs, buf);
  105. if (ret < 0) {
  106. dev_err(&client->dev, "ltc2941 write_reg failed!\n");
  107. return ret;
  108. }
  109. dev_dbg(&client->dev, "%s (%#x, %d) -> %#x\n",
  110. __func__, reg, num_regs, *buf);
  111. return 0;
  112. }
  113. static int ltc294x_reset(const struct ltc294x_info *info, int prescaler_exp)
  114. {
  115. int ret;
  116. u8 value;
  117. u8 control;
  118. /* Read status and control registers */
  119. ret = ltc294x_read_regs(info->client, LTC294X_REG_CONTROL, &value, 1);
  120. if (ret < 0) {
  121. dev_err(&info->client->dev,
  122. "Could not read registers from device\n");
  123. goto error_exit;
  124. }
  125. control = LTC294X_REG_CONTROL_PRESCALER_SET(prescaler_exp) |
  126. LTC294X_REG_CONTROL_ALCC_CONFIG_DISABLED;
  127. /* Put the 2943 into "monitor" mode, so it measures every 10 sec */
  128. if (info->num_regs == LTC2943_NUM_REGS)
  129. control |= LTC2943_REG_CONTROL_MODE_SCAN;
  130. if (value != control) {
  131. ret = ltc294x_write_regs(info->client,
  132. LTC294X_REG_CONTROL, &control, 1);
  133. if (ret < 0) {
  134. dev_err(&info->client->dev,
  135. "Could not write register\n");
  136. goto error_exit;
  137. }
  138. }
  139. return 0;
  140. error_exit:
  141. return ret;
  142. }
  143. static int ltc294x_read_charge_register(const struct ltc294x_info *info)
  144. {
  145. int ret;
  146. u8 datar[2];
  147. ret = ltc294x_read_regs(info->client,
  148. LTC294X_REG_ACC_CHARGE_MSB, &datar[0], 2);
  149. if (ret < 0)
  150. return ret;
  151. return (datar[0] << 8) + datar[1];
  152. }
  153. static int ltc294x_get_charge_now(const struct ltc294x_info *info, int *val)
  154. {
  155. int value = ltc294x_read_charge_register(info);
  156. if (value < 0)
  157. return value;
  158. /* When r_sense < 0, this counts up when the battery discharges */
  159. if (info->Qlsb < 0)
  160. value -= 0xFFFF;
  161. *val = convert_bin_to_uAh(info, value);
  162. return 0;
  163. }
  164. static int ltc294x_set_charge_now(const struct ltc294x_info *info, int val)
  165. {
  166. int ret;
  167. u8 dataw[2];
  168. u8 ctrl_reg;
  169. s32 value;
  170. value = convert_uAh_to_bin(info, val);
  171. /* Direction depends on how sense+/- were connected */
  172. if (info->Qlsb < 0)
  173. value += 0xFFFF;
  174. if ((value < 0) || (value > 0xFFFF)) /* input validation */
  175. return -EINVAL;
  176. /* Read control register */
  177. ret = ltc294x_read_regs(info->client,
  178. LTC294X_REG_CONTROL, &ctrl_reg, 1);
  179. if (ret < 0)
  180. return ret;
  181. /* Disable analog section */
  182. ctrl_reg |= LTC294X_REG_CONTROL_SHUTDOWN_MASK;
  183. ret = ltc294x_write_regs(info->client,
  184. LTC294X_REG_CONTROL, &ctrl_reg, 1);
  185. if (ret < 0)
  186. return ret;
  187. /* Set new charge value */
  188. dataw[0] = I16_MSB(value);
  189. dataw[1] = I16_LSB(value);
  190. ret = ltc294x_write_regs(info->client,
  191. LTC294X_REG_ACC_CHARGE_MSB, &dataw[0], 2);
  192. if (ret < 0)
  193. goto error_exit;
  194. /* Enable analog section */
  195. error_exit:
  196. ctrl_reg &= ~LTC294X_REG_CONTROL_SHUTDOWN_MASK;
  197. ret = ltc294x_write_regs(info->client,
  198. LTC294X_REG_CONTROL, &ctrl_reg, 1);
  199. return ret < 0 ? ret : 0;
  200. }
  201. static int ltc294x_get_charge_counter(
  202. const struct ltc294x_info *info, int *val)
  203. {
  204. int value = ltc294x_read_charge_register(info);
  205. if (value < 0)
  206. return value;
  207. value -= LTC294X_MID_SUPPLY;
  208. *val = convert_bin_to_uAh(info, value);
  209. return 0;
  210. }
  211. static int ltc294x_get_voltage(const struct ltc294x_info *info, int *val)
  212. {
  213. int ret;
  214. u8 datar[2];
  215. u32 value;
  216. ret = ltc294x_read_regs(info->client,
  217. LTC294X_REG_VOLTAGE_MSB, &datar[0], 2);
  218. value = (datar[0] << 8) | datar[1];
  219. *val = ((value * 23600) / 0xFFFF) * 1000; /* in uV */
  220. return ret;
  221. }
  222. static int ltc294x_get_current(const struct ltc294x_info *info, int *val)
  223. {
  224. int ret;
  225. u8 datar[2];
  226. s32 value;
  227. ret = ltc294x_read_regs(info->client,
  228. LTC294X_REG_CURRENT_MSB, &datar[0], 2);
  229. value = (datar[0] << 8) | datar[1];
  230. value -= 0x7FFF;
  231. /* Value is in range -32k..+32k, r_sense is usually 10..50 mOhm,
  232. * the formula below keeps everything in s32 range while preserving
  233. * enough digits */
  234. *val = 1000 * ((60000 * value) / (info->r_sense * 0x7FFF)); /* in uA */
  235. return ret;
  236. }
  237. static int ltc294x_get_temperature(const struct ltc294x_info *info, int *val)
  238. {
  239. int ret;
  240. u8 datar[2];
  241. u32 value;
  242. ret = ltc294x_read_regs(info->client,
  243. LTC294X_REG_TEMPERATURE_MSB, &datar[0], 2);
  244. value = (datar[0] << 8) | datar[1];
  245. /* Full-scale is 510 Kelvin, convert to centidegrees */
  246. *val = (((51000 * value) / 0xFFFF) - 27215);
  247. return ret;
  248. }
  249. static int ltc294x_get_property(struct power_supply *psy,
  250. enum power_supply_property prop,
  251. union power_supply_propval *val)
  252. {
  253. struct ltc294x_info *info = power_supply_get_drvdata(psy);
  254. switch (prop) {
  255. case POWER_SUPPLY_PROP_CHARGE_NOW:
  256. return ltc294x_get_charge_now(info, &val->intval);
  257. case POWER_SUPPLY_PROP_CHARGE_COUNTER:
  258. return ltc294x_get_charge_counter(info, &val->intval);
  259. case POWER_SUPPLY_PROP_VOLTAGE_NOW:
  260. return ltc294x_get_voltage(info, &val->intval);
  261. case POWER_SUPPLY_PROP_CURRENT_NOW:
  262. return ltc294x_get_current(info, &val->intval);
  263. case POWER_SUPPLY_PROP_TEMP:
  264. return ltc294x_get_temperature(info, &val->intval);
  265. default:
  266. return -EINVAL;
  267. }
  268. }
  269. static int ltc294x_set_property(struct power_supply *psy,
  270. enum power_supply_property psp,
  271. const union power_supply_propval *val)
  272. {
  273. struct ltc294x_info *info = power_supply_get_drvdata(psy);
  274. switch (psp) {
  275. case POWER_SUPPLY_PROP_CHARGE_NOW:
  276. return ltc294x_set_charge_now(info, val->intval);
  277. default:
  278. return -EPERM;
  279. }
  280. }
  281. static int ltc294x_property_is_writeable(
  282. struct power_supply *psy, enum power_supply_property psp)
  283. {
  284. switch (psp) {
  285. case POWER_SUPPLY_PROP_CHARGE_NOW:
  286. return 1;
  287. default:
  288. return 0;
  289. }
  290. }
  291. static void ltc294x_update(struct ltc294x_info *info)
  292. {
  293. int charge = ltc294x_read_charge_register(info);
  294. if (charge != info->charge) {
  295. info->charge = charge;
  296. power_supply_changed(info->supply);
  297. }
  298. }
  299. static void ltc294x_work(struct work_struct *work)
  300. {
  301. struct ltc294x_info *info;
  302. info = container_of(work, struct ltc294x_info, work.work);
  303. ltc294x_update(info);
  304. schedule_delayed_work(&info->work, LTC294X_WORK_DELAY * HZ);
  305. }
  306. static enum power_supply_property ltc294x_properties[] = {
  307. POWER_SUPPLY_PROP_CHARGE_COUNTER,
  308. POWER_SUPPLY_PROP_CHARGE_NOW,
  309. POWER_SUPPLY_PROP_VOLTAGE_NOW,
  310. POWER_SUPPLY_PROP_CURRENT_NOW,
  311. POWER_SUPPLY_PROP_TEMP,
  312. };
  313. static int ltc294x_i2c_remove(struct i2c_client *client)
  314. {
  315. struct ltc294x_info *info = i2c_get_clientdata(client);
  316. cancel_delayed_work(&info->work);
  317. power_supply_unregister(info->supply);
  318. kfree(info->supply_desc.name);
  319. mutex_lock(&ltc294x_lock);
  320. idr_remove(&ltc294x_id, info->id);
  321. mutex_unlock(&ltc294x_lock);
  322. return 0;
  323. }
  324. static int ltc294x_i2c_probe(struct i2c_client *client,
  325. const struct i2c_device_id *id)
  326. {
  327. struct power_supply_config psy_cfg = {};
  328. struct ltc294x_info *info;
  329. int ret;
  330. int num;
  331. u32 prescaler_exp;
  332. s32 r_sense;
  333. struct device_node *np;
  334. mutex_lock(&ltc294x_lock);
  335. ret = idr_alloc(&ltc294x_id, client, 0, 0, GFP_KERNEL);
  336. mutex_unlock(&ltc294x_lock);
  337. if (ret < 0)
  338. goto fail_id;
  339. num = ret;
  340. info = devm_kzalloc(&client->dev, sizeof(*info), GFP_KERNEL);
  341. if (info == NULL) {
  342. ret = -ENOMEM;
  343. goto fail_info;
  344. }
  345. i2c_set_clientdata(client, info);
  346. info->num_regs = id->driver_data;
  347. info->supply_desc.name = kasprintf(GFP_KERNEL, "%s-%d", client->name,
  348. num);
  349. if (!info->supply_desc.name) {
  350. ret = -ENOMEM;
  351. goto fail_name;
  352. }
  353. np = of_node_get(client->dev.of_node);
  354. /* r_sense can be negative, when sense+ is connected to the battery
  355. * instead of the sense-. This results in reversed measurements. */
  356. ret = of_property_read_u32(np, "lltc,resistor-sense", &r_sense);
  357. if (ret < 0) {
  358. dev_err(&client->dev,
  359. "Could not find lltc,resistor-sense in devicetree\n");
  360. goto fail_name;
  361. }
  362. info->r_sense = r_sense;
  363. ret = of_property_read_u32(np, "lltc,prescaler-exponent",
  364. &prescaler_exp);
  365. if (ret < 0) {
  366. dev_warn(&client->dev,
  367. "lltc,prescaler-exponent not in devicetree\n");
  368. prescaler_exp = LTC2941_MAX_PRESCALER_EXP;
  369. }
  370. if (info->num_regs == LTC2943_NUM_REGS) {
  371. if (prescaler_exp > LTC2943_MAX_PRESCALER_EXP)
  372. prescaler_exp = LTC2943_MAX_PRESCALER_EXP;
  373. info->Qlsb = ((340 * 50000) / r_sense) /
  374. (4096 / (1 << (2*prescaler_exp)));
  375. } else {
  376. if (prescaler_exp > LTC2941_MAX_PRESCALER_EXP)
  377. prescaler_exp = LTC2941_MAX_PRESCALER_EXP;
  378. info->Qlsb = ((85 * 50000) / r_sense) /
  379. (128 / (1 << prescaler_exp));
  380. }
  381. info->client = client;
  382. info->id = num;
  383. info->supply_desc.type = POWER_SUPPLY_TYPE_BATTERY;
  384. info->supply_desc.properties = ltc294x_properties;
  385. if (info->num_regs >= LTC294X_REG_TEMPERATURE_LSB)
  386. info->supply_desc.num_properties =
  387. ARRAY_SIZE(ltc294x_properties);
  388. else if (info->num_regs >= LTC294X_REG_CURRENT_LSB)
  389. info->supply_desc.num_properties =
  390. ARRAY_SIZE(ltc294x_properties) - 1;
  391. else if (info->num_regs >= LTC294X_REG_VOLTAGE_LSB)
  392. info->supply_desc.num_properties =
  393. ARRAY_SIZE(ltc294x_properties) - 2;
  394. else
  395. info->supply_desc.num_properties =
  396. ARRAY_SIZE(ltc294x_properties) - 3;
  397. info->supply_desc.get_property = ltc294x_get_property;
  398. info->supply_desc.set_property = ltc294x_set_property;
  399. info->supply_desc.property_is_writeable = ltc294x_property_is_writeable;
  400. info->supply_desc.external_power_changed = NULL;
  401. psy_cfg.drv_data = info;
  402. INIT_DELAYED_WORK(&info->work, ltc294x_work);
  403. ret = ltc294x_reset(info, prescaler_exp);
  404. if (ret < 0) {
  405. dev_err(&client->dev, "Communication with chip failed\n");
  406. goto fail_comm;
  407. }
  408. info->supply = power_supply_register(&client->dev, &info->supply_desc,
  409. &psy_cfg);
  410. if (IS_ERR(info->supply)) {
  411. dev_err(&client->dev, "failed to register ltc2941\n");
  412. ret = PTR_ERR(info->supply);
  413. goto fail_register;
  414. } else {
  415. schedule_delayed_work(&info->work, LTC294X_WORK_DELAY * HZ);
  416. }
  417. return 0;
  418. fail_register:
  419. kfree(info->supply_desc.name);
  420. fail_comm:
  421. fail_name:
  422. fail_info:
  423. mutex_lock(&ltc294x_lock);
  424. idr_remove(&ltc294x_id, num);
  425. mutex_unlock(&ltc294x_lock);
  426. fail_id:
  427. return ret;
  428. }
  429. #ifdef CONFIG_PM_SLEEP
  430. static int ltc294x_suspend(struct device *dev)
  431. {
  432. struct i2c_client *client = to_i2c_client(dev);
  433. struct ltc294x_info *info = i2c_get_clientdata(client);
  434. cancel_delayed_work(&info->work);
  435. return 0;
  436. }
  437. static int ltc294x_resume(struct device *dev)
  438. {
  439. struct i2c_client *client = to_i2c_client(dev);
  440. struct ltc294x_info *info = i2c_get_clientdata(client);
  441. schedule_delayed_work(&info->work, LTC294X_WORK_DELAY * HZ);
  442. return 0;
  443. }
  444. static SIMPLE_DEV_PM_OPS(ltc294x_pm_ops, ltc294x_suspend, ltc294x_resume);
  445. #define LTC294X_PM_OPS (&ltc294x_pm_ops)
  446. #else
  447. #define LTC294X_PM_OPS NULL
  448. #endif /* CONFIG_PM_SLEEP */
  449. static const struct i2c_device_id ltc294x_i2c_id[] = {
  450. {"ltc2941", LTC2941_NUM_REGS},
  451. {"ltc2943", LTC2943_NUM_REGS},
  452. { },
  453. };
  454. MODULE_DEVICE_TABLE(i2c, ltc294x_i2c_id);
  455. static struct i2c_driver ltc294x_driver = {
  456. .driver = {
  457. .name = "LTC2941",
  458. .pm = LTC294X_PM_OPS,
  459. },
  460. .probe = ltc294x_i2c_probe,
  461. .remove = ltc294x_i2c_remove,
  462. .id_table = ltc294x_i2c_id,
  463. };
  464. module_i2c_driver(ltc294x_driver);
  465. MODULE_AUTHOR("Auryn Verwegen, Topic Embedded Systems");
  466. MODULE_AUTHOR("Mike Looijmans, Topic Embedded Products");
  467. MODULE_DESCRIPTION("LTC2941/LTC2943 Battery Gas Gauge IC driver");
  468. MODULE_LICENSE("GPL");