cw2015_battery.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Fuel gauge driver for CellWise 2013 / 2015
  4. *
  5. * Copyright (C) 2012, RockChip
  6. * Copyright (C) 2020, Tobias Schramm
  7. *
  8. * Authors: xuhuicong <[email protected]>
  9. * Authors: Tobias Schramm <[email protected]>
  10. */
  11. #include <linux/bits.h>
  12. #include <linux/delay.h>
  13. #include <linux/i2c.h>
  14. #include <linux/gfp.h>
  15. #include <linux/gpio/consumer.h>
  16. #include <linux/kernel.h>
  17. #include <linux/module.h>
  18. #include <linux/power_supply.h>
  19. #include <linux/property.h>
  20. #include <linux/regmap.h>
  21. #include <linux/time.h>
  22. #include <linux/workqueue.h>
  23. #include <linux/devm-helpers.h>
  24. #define CW2015_SIZE_BATINFO 64
  25. #define CW2015_RESET_TRIES 5
  26. #define CW2015_REG_VERSION 0x00
  27. #define CW2015_REG_VCELL 0x02
  28. #define CW2015_REG_SOC 0x04
  29. #define CW2015_REG_RRT_ALERT 0x06
  30. #define CW2015_REG_CONFIG 0x08
  31. #define CW2015_REG_MODE 0x0A
  32. #define CW2015_REG_BATINFO 0x10
  33. #define CW2015_MODE_SLEEP_MASK GENMASK(7, 6)
  34. #define CW2015_MODE_SLEEP (0x03 << 6)
  35. #define CW2015_MODE_NORMAL (0x00 << 6)
  36. #define CW2015_MODE_QUICK_START (0x03 << 4)
  37. #define CW2015_MODE_RESTART (0x0f << 0)
  38. #define CW2015_CONFIG_UPDATE_FLG (0x01 << 1)
  39. #define CW2015_ATHD(x) ((x) << 3)
  40. #define CW2015_MASK_ATHD GENMASK(7, 3)
  41. #define CW2015_MASK_SOC GENMASK(12, 0)
  42. /* reset gauge of no valid state of charge could be polled for 40s */
  43. #define CW2015_BAT_SOC_ERROR_MS (40 * MSEC_PER_SEC)
  44. /* reset gauge if state of charge stuck for half an hour during charging */
  45. #define CW2015_BAT_CHARGING_STUCK_MS (1800 * MSEC_PER_SEC)
  46. /* poll interval from CellWise GPL Android driver example */
  47. #define CW2015_DEFAULT_POLL_INTERVAL_MS 8000
  48. #define CW2015_AVERAGING_SAMPLES 3
  49. struct cw_battery {
  50. struct device *dev;
  51. struct workqueue_struct *battery_workqueue;
  52. struct delayed_work battery_delay_work;
  53. struct regmap *regmap;
  54. struct power_supply *rk_bat;
  55. struct power_supply_battery_info *battery;
  56. u8 *bat_profile;
  57. bool charger_attached;
  58. bool battery_changed;
  59. int soc;
  60. int voltage_mv;
  61. int status;
  62. int time_to_empty;
  63. int charge_count;
  64. u32 poll_interval_ms;
  65. u8 alert_level;
  66. unsigned int read_errors;
  67. unsigned int charge_stuck_cnt;
  68. };
  69. static int cw_read_word(struct cw_battery *cw_bat, u8 reg, u16 *val)
  70. {
  71. __be16 value;
  72. int ret;
  73. ret = regmap_bulk_read(cw_bat->regmap, reg, &value, sizeof(value));
  74. if (ret)
  75. return ret;
  76. *val = be16_to_cpu(value);
  77. return 0;
  78. }
  79. static int cw_update_profile(struct cw_battery *cw_bat)
  80. {
  81. int ret;
  82. unsigned int reg_val;
  83. u8 reset_val;
  84. /* make sure gauge is not in sleep mode */
  85. ret = regmap_read(cw_bat->regmap, CW2015_REG_MODE, &reg_val);
  86. if (ret)
  87. return ret;
  88. reset_val = reg_val;
  89. if ((reg_val & CW2015_MODE_SLEEP_MASK) == CW2015_MODE_SLEEP) {
  90. dev_err(cw_bat->dev,
  91. "Gauge is in sleep mode, can't update battery info\n");
  92. return -EINVAL;
  93. }
  94. /* write new battery info */
  95. ret = regmap_raw_write(cw_bat->regmap, CW2015_REG_BATINFO,
  96. cw_bat->bat_profile,
  97. CW2015_SIZE_BATINFO);
  98. if (ret)
  99. return ret;
  100. /* set config update flag */
  101. reg_val |= CW2015_CONFIG_UPDATE_FLG;
  102. reg_val &= ~CW2015_MASK_ATHD;
  103. reg_val |= CW2015_ATHD(cw_bat->alert_level);
  104. ret = regmap_write(cw_bat->regmap, CW2015_REG_CONFIG, reg_val);
  105. if (ret)
  106. return ret;
  107. /* reset gauge to apply new battery profile */
  108. reset_val &= ~CW2015_MODE_RESTART;
  109. reg_val = reset_val | CW2015_MODE_RESTART;
  110. ret = regmap_write(cw_bat->regmap, CW2015_REG_MODE, reg_val);
  111. if (ret)
  112. return ret;
  113. /* wait for gauge to reset */
  114. msleep(20);
  115. /* clear reset flag */
  116. ret = regmap_write(cw_bat->regmap, CW2015_REG_MODE, reset_val);
  117. if (ret)
  118. return ret;
  119. /* wait for gauge to become ready */
  120. ret = regmap_read_poll_timeout(cw_bat->regmap, CW2015_REG_SOC,
  121. reg_val, reg_val <= 100,
  122. 10 * USEC_PER_MSEC, 10 * USEC_PER_SEC);
  123. if (ret)
  124. dev_err(cw_bat->dev,
  125. "Gauge did not become ready after profile upload\n");
  126. else
  127. dev_dbg(cw_bat->dev, "Battery profile updated\n");
  128. return ret;
  129. }
  130. static int cw_init(struct cw_battery *cw_bat)
  131. {
  132. int ret;
  133. unsigned int reg_val = CW2015_MODE_SLEEP;
  134. if ((reg_val & CW2015_MODE_SLEEP_MASK) == CW2015_MODE_SLEEP) {
  135. reg_val = CW2015_MODE_NORMAL;
  136. ret = regmap_write(cw_bat->regmap, CW2015_REG_MODE, reg_val);
  137. if (ret)
  138. return ret;
  139. }
  140. ret = regmap_read(cw_bat->regmap, CW2015_REG_CONFIG, &reg_val);
  141. if (ret)
  142. return ret;
  143. if ((reg_val & CW2015_MASK_ATHD) != CW2015_ATHD(cw_bat->alert_level)) {
  144. dev_dbg(cw_bat->dev, "Setting new alert level\n");
  145. reg_val &= ~CW2015_MASK_ATHD;
  146. reg_val |= ~CW2015_ATHD(cw_bat->alert_level);
  147. ret = regmap_write(cw_bat->regmap, CW2015_REG_CONFIG, reg_val);
  148. if (ret)
  149. return ret;
  150. }
  151. ret = regmap_read(cw_bat->regmap, CW2015_REG_CONFIG, &reg_val);
  152. if (ret)
  153. return ret;
  154. if (!(reg_val & CW2015_CONFIG_UPDATE_FLG)) {
  155. dev_dbg(cw_bat->dev,
  156. "Battery profile not present, uploading battery profile\n");
  157. if (cw_bat->bat_profile) {
  158. ret = cw_update_profile(cw_bat);
  159. if (ret) {
  160. dev_err(cw_bat->dev,
  161. "Failed to upload battery profile\n");
  162. return ret;
  163. }
  164. } else {
  165. dev_warn(cw_bat->dev,
  166. "No profile specified, continuing without profile\n");
  167. }
  168. } else if (cw_bat->bat_profile) {
  169. u8 bat_info[CW2015_SIZE_BATINFO];
  170. ret = regmap_raw_read(cw_bat->regmap, CW2015_REG_BATINFO,
  171. bat_info, CW2015_SIZE_BATINFO);
  172. if (ret) {
  173. dev_err(cw_bat->dev,
  174. "Failed to read stored battery profile\n");
  175. return ret;
  176. }
  177. if (memcmp(bat_info, cw_bat->bat_profile, CW2015_SIZE_BATINFO)) {
  178. dev_warn(cw_bat->dev, "Replacing stored battery profile\n");
  179. ret = cw_update_profile(cw_bat);
  180. if (ret)
  181. return ret;
  182. }
  183. } else {
  184. dev_warn(cw_bat->dev,
  185. "Can't check current battery profile, no profile provided\n");
  186. }
  187. dev_dbg(cw_bat->dev, "Battery profile configured\n");
  188. return 0;
  189. }
  190. static int cw_power_on_reset(struct cw_battery *cw_bat)
  191. {
  192. int ret;
  193. unsigned char reset_val;
  194. reset_val = CW2015_MODE_SLEEP;
  195. ret = regmap_write(cw_bat->regmap, CW2015_REG_MODE, reset_val);
  196. if (ret)
  197. return ret;
  198. /* wait for gauge to enter sleep */
  199. msleep(20);
  200. reset_val = CW2015_MODE_NORMAL;
  201. ret = regmap_write(cw_bat->regmap, CW2015_REG_MODE, reset_val);
  202. if (ret)
  203. return ret;
  204. ret = cw_init(cw_bat);
  205. if (ret)
  206. return ret;
  207. return 0;
  208. }
  209. #define HYSTERESIS(current, previous, up, down) \
  210. (((current) < (previous) + (up)) && ((current) > (previous) - (down)))
  211. static int cw_get_soc(struct cw_battery *cw_bat)
  212. {
  213. unsigned int soc;
  214. int ret;
  215. ret = regmap_read(cw_bat->regmap, CW2015_REG_SOC, &soc);
  216. if (ret)
  217. return ret;
  218. if (soc > 100) {
  219. int max_error_cycles =
  220. CW2015_BAT_SOC_ERROR_MS / cw_bat->poll_interval_ms;
  221. dev_err(cw_bat->dev, "Invalid SoC %d%%\n", soc);
  222. cw_bat->read_errors++;
  223. if (cw_bat->read_errors > max_error_cycles) {
  224. dev_warn(cw_bat->dev,
  225. "Too many invalid SoC reports, resetting gauge\n");
  226. cw_power_on_reset(cw_bat);
  227. cw_bat->read_errors = 0;
  228. }
  229. return cw_bat->soc;
  230. }
  231. cw_bat->read_errors = 0;
  232. /* Reset gauge if stuck while charging */
  233. if (cw_bat->status == POWER_SUPPLY_STATUS_CHARGING && soc == cw_bat->soc) {
  234. int max_stuck_cycles =
  235. CW2015_BAT_CHARGING_STUCK_MS / cw_bat->poll_interval_ms;
  236. cw_bat->charge_stuck_cnt++;
  237. if (cw_bat->charge_stuck_cnt > max_stuck_cycles) {
  238. dev_warn(cw_bat->dev,
  239. "SoC stuck @%u%%, resetting gauge\n", soc);
  240. cw_power_on_reset(cw_bat);
  241. cw_bat->charge_stuck_cnt = 0;
  242. }
  243. } else {
  244. cw_bat->charge_stuck_cnt = 0;
  245. }
  246. /* Ignore voltage dips during charge */
  247. if (cw_bat->charger_attached && HYSTERESIS(soc, cw_bat->soc, 0, 3))
  248. soc = cw_bat->soc;
  249. /* Ignore voltage spikes during discharge */
  250. if (!cw_bat->charger_attached && HYSTERESIS(soc, cw_bat->soc, 3, 0))
  251. soc = cw_bat->soc;
  252. return soc;
  253. }
  254. static int cw_get_voltage(struct cw_battery *cw_bat)
  255. {
  256. int ret, i, voltage_mv;
  257. u16 reg_val;
  258. u32 avg = 0;
  259. for (i = 0; i < CW2015_AVERAGING_SAMPLES; i++) {
  260. ret = cw_read_word(cw_bat, CW2015_REG_VCELL, &reg_val);
  261. if (ret)
  262. return ret;
  263. avg += reg_val;
  264. }
  265. avg /= CW2015_AVERAGING_SAMPLES;
  266. /*
  267. * 305 uV per ADC step
  268. * Use 312 / 1024 as efficient approximation of 305 / 1000
  269. * Negligible error of 0.1%
  270. */
  271. voltage_mv = avg * 312 / 1024;
  272. dev_dbg(cw_bat->dev, "Read voltage: %d mV, raw=0x%04x\n",
  273. voltage_mv, reg_val);
  274. return voltage_mv;
  275. }
  276. static int cw_get_time_to_empty(struct cw_battery *cw_bat)
  277. {
  278. int ret;
  279. u16 value16;
  280. ret = cw_read_word(cw_bat, CW2015_REG_RRT_ALERT, &value16);
  281. if (ret)
  282. return ret;
  283. return value16 & CW2015_MASK_SOC;
  284. }
  285. static void cw_update_charge_status(struct cw_battery *cw_bat)
  286. {
  287. int ret;
  288. ret = power_supply_am_i_supplied(cw_bat->rk_bat);
  289. if (ret < 0) {
  290. dev_warn(cw_bat->dev, "Failed to get supply state: %d\n", ret);
  291. } else {
  292. bool charger_attached;
  293. charger_attached = !!ret;
  294. if (cw_bat->charger_attached != charger_attached) {
  295. cw_bat->battery_changed = true;
  296. if (charger_attached)
  297. cw_bat->charge_count++;
  298. }
  299. cw_bat->charger_attached = charger_attached;
  300. }
  301. }
  302. static void cw_update_soc(struct cw_battery *cw_bat)
  303. {
  304. int soc;
  305. soc = cw_get_soc(cw_bat);
  306. if (soc < 0)
  307. dev_err(cw_bat->dev, "Failed to get SoC from gauge: %d\n", soc);
  308. else if (cw_bat->soc != soc) {
  309. cw_bat->soc = soc;
  310. cw_bat->battery_changed = true;
  311. }
  312. }
  313. static void cw_update_voltage(struct cw_battery *cw_bat)
  314. {
  315. int voltage_mv;
  316. voltage_mv = cw_get_voltage(cw_bat);
  317. if (voltage_mv < 0)
  318. dev_err(cw_bat->dev, "Failed to get voltage from gauge: %d\n",
  319. voltage_mv);
  320. else
  321. cw_bat->voltage_mv = voltage_mv;
  322. }
  323. static void cw_update_status(struct cw_battery *cw_bat)
  324. {
  325. int status = POWER_SUPPLY_STATUS_DISCHARGING;
  326. if (cw_bat->charger_attached) {
  327. if (cw_bat->soc >= 100)
  328. status = POWER_SUPPLY_STATUS_FULL;
  329. else
  330. status = POWER_SUPPLY_STATUS_CHARGING;
  331. }
  332. if (cw_bat->status != status)
  333. cw_bat->battery_changed = true;
  334. cw_bat->status = status;
  335. }
  336. static void cw_update_time_to_empty(struct cw_battery *cw_bat)
  337. {
  338. int time_to_empty;
  339. time_to_empty = cw_get_time_to_empty(cw_bat);
  340. if (time_to_empty < 0)
  341. dev_err(cw_bat->dev, "Failed to get time to empty from gauge: %d\n",
  342. time_to_empty);
  343. else if (cw_bat->time_to_empty != time_to_empty) {
  344. cw_bat->time_to_empty = time_to_empty;
  345. cw_bat->battery_changed = true;
  346. }
  347. }
  348. static void cw_bat_work(struct work_struct *work)
  349. {
  350. struct delayed_work *delay_work;
  351. struct cw_battery *cw_bat;
  352. int ret;
  353. unsigned int reg_val;
  354. delay_work = to_delayed_work(work);
  355. cw_bat = container_of(delay_work, struct cw_battery, battery_delay_work);
  356. ret = regmap_read(cw_bat->regmap, CW2015_REG_MODE, &reg_val);
  357. if (ret) {
  358. dev_err(cw_bat->dev, "Failed to read mode from gauge: %d\n", ret);
  359. } else {
  360. if ((reg_val & CW2015_MODE_SLEEP_MASK) == CW2015_MODE_SLEEP) {
  361. int i;
  362. for (i = 0; i < CW2015_RESET_TRIES; i++) {
  363. if (!cw_power_on_reset(cw_bat))
  364. break;
  365. }
  366. }
  367. cw_update_soc(cw_bat);
  368. cw_update_voltage(cw_bat);
  369. cw_update_charge_status(cw_bat);
  370. cw_update_status(cw_bat);
  371. cw_update_time_to_empty(cw_bat);
  372. }
  373. dev_dbg(cw_bat->dev, "charger_attached = %d\n", cw_bat->charger_attached);
  374. dev_dbg(cw_bat->dev, "status = %d\n", cw_bat->status);
  375. dev_dbg(cw_bat->dev, "soc = %d%%\n", cw_bat->soc);
  376. dev_dbg(cw_bat->dev, "voltage = %dmV\n", cw_bat->voltage_mv);
  377. if (cw_bat->battery_changed)
  378. power_supply_changed(cw_bat->rk_bat);
  379. cw_bat->battery_changed = false;
  380. queue_delayed_work(cw_bat->battery_workqueue,
  381. &cw_bat->battery_delay_work,
  382. msecs_to_jiffies(cw_bat->poll_interval_ms));
  383. }
  384. static bool cw_battery_valid_time_to_empty(struct cw_battery *cw_bat)
  385. {
  386. return cw_bat->time_to_empty > 0 &&
  387. cw_bat->time_to_empty < CW2015_MASK_SOC &&
  388. cw_bat->status == POWER_SUPPLY_STATUS_DISCHARGING;
  389. }
  390. static int cw_battery_get_property(struct power_supply *psy,
  391. enum power_supply_property psp,
  392. union power_supply_propval *val)
  393. {
  394. struct cw_battery *cw_bat;
  395. cw_bat = power_supply_get_drvdata(psy);
  396. switch (psp) {
  397. case POWER_SUPPLY_PROP_CAPACITY:
  398. val->intval = cw_bat->soc;
  399. break;
  400. case POWER_SUPPLY_PROP_STATUS:
  401. val->intval = cw_bat->status;
  402. break;
  403. case POWER_SUPPLY_PROP_PRESENT:
  404. val->intval = !!cw_bat->voltage_mv;
  405. break;
  406. case POWER_SUPPLY_PROP_VOLTAGE_NOW:
  407. val->intval = cw_bat->voltage_mv * 1000;
  408. break;
  409. case POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW:
  410. if (cw_battery_valid_time_to_empty(cw_bat))
  411. val->intval = cw_bat->time_to_empty;
  412. else
  413. val->intval = 0;
  414. break;
  415. case POWER_SUPPLY_PROP_TECHNOLOGY:
  416. val->intval = POWER_SUPPLY_TECHNOLOGY_LION;
  417. break;
  418. case POWER_SUPPLY_PROP_CHARGE_COUNTER:
  419. val->intval = cw_bat->charge_count;
  420. break;
  421. case POWER_SUPPLY_PROP_CHARGE_FULL:
  422. case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
  423. if (cw_bat->battery->charge_full_design_uah > 0)
  424. val->intval = cw_bat->battery->charge_full_design_uah;
  425. else
  426. val->intval = 0;
  427. break;
  428. case POWER_SUPPLY_PROP_CHARGE_NOW:
  429. val->intval = cw_bat->battery->charge_full_design_uah;
  430. val->intval = val->intval * cw_bat->soc / 100;
  431. break;
  432. case POWER_SUPPLY_PROP_CURRENT_NOW:
  433. if (cw_battery_valid_time_to_empty(cw_bat) &&
  434. cw_bat->battery->charge_full_design_uah > 0) {
  435. /* calculate remaining capacity */
  436. val->intval = cw_bat->battery->charge_full_design_uah;
  437. val->intval = val->intval * cw_bat->soc / 100;
  438. /* estimate current based on time to empty */
  439. val->intval = 60 * val->intval / cw_bat->time_to_empty;
  440. } else {
  441. val->intval = 0;
  442. }
  443. break;
  444. default:
  445. break;
  446. }
  447. return 0;
  448. }
  449. static enum power_supply_property cw_battery_properties[] = {
  450. POWER_SUPPLY_PROP_CAPACITY,
  451. POWER_SUPPLY_PROP_STATUS,
  452. POWER_SUPPLY_PROP_PRESENT,
  453. POWER_SUPPLY_PROP_VOLTAGE_NOW,
  454. POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW,
  455. POWER_SUPPLY_PROP_TECHNOLOGY,
  456. POWER_SUPPLY_PROP_CHARGE_COUNTER,
  457. POWER_SUPPLY_PROP_CHARGE_FULL,
  458. POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
  459. POWER_SUPPLY_PROP_CHARGE_NOW,
  460. POWER_SUPPLY_PROP_CURRENT_NOW,
  461. };
  462. static const struct power_supply_desc cw2015_bat_desc = {
  463. .name = "cw2015-battery",
  464. .type = POWER_SUPPLY_TYPE_BATTERY,
  465. .properties = cw_battery_properties,
  466. .num_properties = ARRAY_SIZE(cw_battery_properties),
  467. .get_property = cw_battery_get_property,
  468. };
  469. static int cw2015_parse_properties(struct cw_battery *cw_bat)
  470. {
  471. struct device *dev = cw_bat->dev;
  472. int length;
  473. int ret;
  474. length = device_property_count_u8(dev, "cellwise,battery-profile");
  475. if (length < 0) {
  476. dev_warn(cw_bat->dev,
  477. "No battery-profile found, using current flash contents\n");
  478. } else if (length != CW2015_SIZE_BATINFO) {
  479. dev_err(cw_bat->dev, "battery-profile must be %d bytes\n",
  480. CW2015_SIZE_BATINFO);
  481. return -EINVAL;
  482. } else {
  483. cw_bat->bat_profile = devm_kzalloc(dev, length, GFP_KERNEL);
  484. if (!cw_bat->bat_profile)
  485. return -ENOMEM;
  486. ret = device_property_read_u8_array(dev,
  487. "cellwise,battery-profile",
  488. cw_bat->bat_profile,
  489. length);
  490. if (ret)
  491. return ret;
  492. }
  493. ret = device_property_read_u32(dev, "cellwise,monitor-interval-ms",
  494. &cw_bat->poll_interval_ms);
  495. if (ret) {
  496. dev_dbg(cw_bat->dev, "Using default poll interval\n");
  497. cw_bat->poll_interval_ms = CW2015_DEFAULT_POLL_INTERVAL_MS;
  498. }
  499. return 0;
  500. }
  501. static const struct regmap_range regmap_ranges_rd_yes[] = {
  502. regmap_reg_range(CW2015_REG_VERSION, CW2015_REG_VERSION),
  503. regmap_reg_range(CW2015_REG_VCELL, CW2015_REG_CONFIG),
  504. regmap_reg_range(CW2015_REG_MODE, CW2015_REG_MODE),
  505. regmap_reg_range(CW2015_REG_BATINFO,
  506. CW2015_REG_BATINFO + CW2015_SIZE_BATINFO - 1),
  507. };
  508. static const struct regmap_access_table regmap_rd_table = {
  509. .yes_ranges = regmap_ranges_rd_yes,
  510. .n_yes_ranges = 4,
  511. };
  512. static const struct regmap_range regmap_ranges_wr_yes[] = {
  513. regmap_reg_range(CW2015_REG_RRT_ALERT, CW2015_REG_CONFIG),
  514. regmap_reg_range(CW2015_REG_MODE, CW2015_REG_MODE),
  515. regmap_reg_range(CW2015_REG_BATINFO,
  516. CW2015_REG_BATINFO + CW2015_SIZE_BATINFO - 1),
  517. };
  518. static const struct regmap_access_table regmap_wr_table = {
  519. .yes_ranges = regmap_ranges_wr_yes,
  520. .n_yes_ranges = 3,
  521. };
  522. static const struct regmap_range regmap_ranges_vol_yes[] = {
  523. regmap_reg_range(CW2015_REG_VCELL, CW2015_REG_SOC + 1),
  524. };
  525. static const struct regmap_access_table regmap_vol_table = {
  526. .yes_ranges = regmap_ranges_vol_yes,
  527. .n_yes_ranges = 1,
  528. };
  529. static const struct regmap_config cw2015_regmap_config = {
  530. .reg_bits = 8,
  531. .val_bits = 8,
  532. .rd_table = &regmap_rd_table,
  533. .wr_table = &regmap_wr_table,
  534. .volatile_table = &regmap_vol_table,
  535. .max_register = CW2015_REG_BATINFO + CW2015_SIZE_BATINFO - 1,
  536. };
  537. static int cw_bat_probe(struct i2c_client *client)
  538. {
  539. int ret;
  540. struct cw_battery *cw_bat;
  541. struct power_supply_config psy_cfg = { 0 };
  542. cw_bat = devm_kzalloc(&client->dev, sizeof(*cw_bat), GFP_KERNEL);
  543. if (!cw_bat)
  544. return -ENOMEM;
  545. i2c_set_clientdata(client, cw_bat);
  546. cw_bat->dev = &client->dev;
  547. cw_bat->soc = 1;
  548. ret = cw2015_parse_properties(cw_bat);
  549. if (ret) {
  550. dev_err(cw_bat->dev, "Failed to parse cw2015 properties\n");
  551. return ret;
  552. }
  553. cw_bat->regmap = devm_regmap_init_i2c(client, &cw2015_regmap_config);
  554. if (IS_ERR(cw_bat->regmap)) {
  555. dev_err(cw_bat->dev, "Failed to allocate regmap: %ld\n",
  556. PTR_ERR(cw_bat->regmap));
  557. return PTR_ERR(cw_bat->regmap);
  558. }
  559. ret = cw_init(cw_bat);
  560. if (ret) {
  561. dev_err(cw_bat->dev, "Init failed: %d\n", ret);
  562. return ret;
  563. }
  564. psy_cfg.drv_data = cw_bat;
  565. psy_cfg.fwnode = dev_fwnode(cw_bat->dev);
  566. cw_bat->rk_bat = devm_power_supply_register(&client->dev,
  567. &cw2015_bat_desc,
  568. &psy_cfg);
  569. if (IS_ERR(cw_bat->rk_bat)) {
  570. /* try again if this happens */
  571. dev_err_probe(&client->dev, PTR_ERR(cw_bat->rk_bat),
  572. "Failed to register power supply\n");
  573. return PTR_ERR(cw_bat->rk_bat);
  574. }
  575. ret = power_supply_get_battery_info(cw_bat->rk_bat, &cw_bat->battery);
  576. if (ret) {
  577. /* Allocate an empty battery */
  578. cw_bat->battery = devm_kzalloc(&client->dev,
  579. sizeof(*cw_bat->battery),
  580. GFP_KERNEL);
  581. if (!cw_bat->battery)
  582. return -ENOMEM;
  583. dev_warn(cw_bat->dev,
  584. "No monitored battery, some properties will be missing\n");
  585. }
  586. cw_bat->battery_workqueue = create_singlethread_workqueue("rk_battery");
  587. if (!cw_bat->battery_workqueue)
  588. return -ENOMEM;
  589. devm_delayed_work_autocancel(&client->dev,
  590. &cw_bat->battery_delay_work, cw_bat_work);
  591. queue_delayed_work(cw_bat->battery_workqueue,
  592. &cw_bat->battery_delay_work, msecs_to_jiffies(10));
  593. return 0;
  594. }
  595. static int __maybe_unused cw_bat_suspend(struct device *dev)
  596. {
  597. struct i2c_client *client = to_i2c_client(dev);
  598. struct cw_battery *cw_bat = i2c_get_clientdata(client);
  599. cancel_delayed_work_sync(&cw_bat->battery_delay_work);
  600. return 0;
  601. }
  602. static int __maybe_unused cw_bat_resume(struct device *dev)
  603. {
  604. struct i2c_client *client = to_i2c_client(dev);
  605. struct cw_battery *cw_bat = i2c_get_clientdata(client);
  606. queue_delayed_work(cw_bat->battery_workqueue,
  607. &cw_bat->battery_delay_work, 0);
  608. return 0;
  609. }
  610. static SIMPLE_DEV_PM_OPS(cw_bat_pm_ops, cw_bat_suspend, cw_bat_resume);
  611. static const struct i2c_device_id cw_bat_id_table[] = {
  612. { "cw2015", 0 },
  613. { }
  614. };
  615. static const struct of_device_id cw2015_of_match[] = {
  616. { .compatible = "cellwise,cw2015" },
  617. { }
  618. };
  619. MODULE_DEVICE_TABLE(of, cw2015_of_match);
  620. static struct i2c_driver cw_bat_driver = {
  621. .driver = {
  622. .name = "cw2015",
  623. .of_match_table = cw2015_of_match,
  624. .pm = &cw_bat_pm_ops,
  625. },
  626. .probe_new = cw_bat_probe,
  627. .id_table = cw_bat_id_table,
  628. };
  629. module_i2c_driver(cw_bat_driver);
  630. MODULE_AUTHOR("xhc<[email protected]>");
  631. MODULE_AUTHOR("Tobias Schramm <[email protected]>");
  632. MODULE_DESCRIPTION("cw2015/cw2013 battery driver");
  633. MODULE_LICENSE("GPL");