max77693_charger.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808
  1. // SPDX-License-Identifier: GPL-2.0+
  2. //
  3. // max77693_charger.c - Battery charger driver for the Maxim 77693
  4. //
  5. // Copyright (C) 2014 Samsung Electronics
  6. // Krzysztof Kozlowski <krzk@kernel.org>
  7. #include <linux/module.h>
  8. #include <linux/platform_device.h>
  9. #include <linux/power_supply.h>
  10. #include <linux/regmap.h>
  11. #include <linux/mfd/max77693.h>
  12. #include <linux/mfd/max77693-common.h>
  13. #include <linux/mfd/max77693-private.h>
  14. #define MAX77693_CHARGER_NAME "max77693-charger"
  15. static const char *max77693_charger_model = "MAX77693";
  16. static const char *max77693_charger_manufacturer = "Maxim Integrated";
  17. struct max77693_charger {
  18. struct device *dev;
  19. struct max77693_dev *max77693;
  20. struct power_supply *charger;
  21. u32 constant_volt;
  22. u32 min_system_volt;
  23. u32 thermal_regulation_temp;
  24. u32 batttery_overcurrent;
  25. u32 charge_input_threshold_volt;
  26. };
  27. static int max77693_get_charger_state(struct regmap *regmap, int *val)
  28. {
  29. int ret;
  30. unsigned int data;
  31. ret = regmap_read(regmap, MAX77693_CHG_REG_CHG_DETAILS_01, &data);
  32. if (ret < 0)
  33. return ret;
  34. data &= CHG_DETAILS_01_CHG_MASK;
  35. data >>= CHG_DETAILS_01_CHG_SHIFT;
  36. switch (data) {
  37. case MAX77693_CHARGING_PREQUALIFICATION:
  38. case MAX77693_CHARGING_FAST_CONST_CURRENT:
  39. case MAX77693_CHARGING_FAST_CONST_VOLTAGE:
  40. case MAX77693_CHARGING_TOP_OFF:
  41. /* In high temp the charging current is reduced, but still charging */
  42. case MAX77693_CHARGING_HIGH_TEMP:
  43. *val = POWER_SUPPLY_STATUS_CHARGING;
  44. break;
  45. case MAX77693_CHARGING_DONE:
  46. *val = POWER_SUPPLY_STATUS_FULL;
  47. break;
  48. case MAX77693_CHARGING_TIMER_EXPIRED:
  49. case MAX77693_CHARGING_THERMISTOR_SUSPEND:
  50. *val = POWER_SUPPLY_STATUS_NOT_CHARGING;
  51. break;
  52. case MAX77693_CHARGING_OFF:
  53. case MAX77693_CHARGING_OVER_TEMP:
  54. case MAX77693_CHARGING_WATCHDOG_EXPIRED:
  55. *val = POWER_SUPPLY_STATUS_DISCHARGING;
  56. break;
  57. case MAX77693_CHARGING_RESERVED:
  58. default:
  59. *val = POWER_SUPPLY_STATUS_UNKNOWN;
  60. }
  61. return 0;
  62. }
  63. static int max77693_get_charge_type(struct regmap *regmap, int *val)
  64. {
  65. int ret;
  66. unsigned int data;
  67. ret = regmap_read(regmap, MAX77693_CHG_REG_CHG_DETAILS_01, &data);
  68. if (ret < 0)
  69. return ret;
  70. data &= CHG_DETAILS_01_CHG_MASK;
  71. data >>= CHG_DETAILS_01_CHG_SHIFT;
  72. switch (data) {
  73. case MAX77693_CHARGING_PREQUALIFICATION:
  74. /*
  75. * Top-off: trickle or fast? In top-off the current varies between
  76. * 100 and 250 mA. It is higher than prequalification current.
  77. */
  78. case MAX77693_CHARGING_TOP_OFF:
  79. *val = POWER_SUPPLY_CHARGE_TYPE_TRICKLE;
  80. break;
  81. case MAX77693_CHARGING_FAST_CONST_CURRENT:
  82. case MAX77693_CHARGING_FAST_CONST_VOLTAGE:
  83. /* In high temp the charging current is reduced, but still charging */
  84. case MAX77693_CHARGING_HIGH_TEMP:
  85. *val = POWER_SUPPLY_CHARGE_TYPE_FAST;
  86. break;
  87. case MAX77693_CHARGING_DONE:
  88. case MAX77693_CHARGING_TIMER_EXPIRED:
  89. case MAX77693_CHARGING_THERMISTOR_SUSPEND:
  90. case MAX77693_CHARGING_OFF:
  91. case MAX77693_CHARGING_OVER_TEMP:
  92. case MAX77693_CHARGING_WATCHDOG_EXPIRED:
  93. *val = POWER_SUPPLY_CHARGE_TYPE_NONE;
  94. break;
  95. case MAX77693_CHARGING_RESERVED:
  96. default:
  97. *val = POWER_SUPPLY_CHARGE_TYPE_UNKNOWN;
  98. }
  99. return 0;
  100. }
  101. /*
  102. * Supported health statuses:
  103. * - POWER_SUPPLY_HEALTH_DEAD
  104. * - POWER_SUPPLY_HEALTH_GOOD
  105. * - POWER_SUPPLY_HEALTH_OVERVOLTAGE
  106. * - POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE
  107. * - POWER_SUPPLY_HEALTH_UNKNOWN
  108. * - POWER_SUPPLY_HEALTH_UNSPEC_FAILURE
  109. */
  110. static int max77693_get_battery_health(struct regmap *regmap, int *val)
  111. {
  112. int ret;
  113. unsigned int data;
  114. ret = regmap_read(regmap, MAX77693_CHG_REG_CHG_DETAILS_01, &data);
  115. if (ret < 0)
  116. return ret;
  117. data &= CHG_DETAILS_01_BAT_MASK;
  118. data >>= CHG_DETAILS_01_BAT_SHIFT;
  119. switch (data) {
  120. case MAX77693_BATTERY_NOBAT:
  121. *val = POWER_SUPPLY_HEALTH_DEAD;
  122. break;
  123. case MAX77693_BATTERY_PREQUALIFICATION:
  124. case MAX77693_BATTERY_GOOD:
  125. case MAX77693_BATTERY_LOWVOLTAGE:
  126. *val = POWER_SUPPLY_HEALTH_GOOD;
  127. break;
  128. case MAX77693_BATTERY_TIMER_EXPIRED:
  129. /*
  130. * Took longer to charge than expected, charging suspended.
  131. * Damaged battery?
  132. */
  133. *val = POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE;
  134. break;
  135. case MAX77693_BATTERY_OVERVOLTAGE:
  136. *val = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
  137. break;
  138. case MAX77693_BATTERY_OVERCURRENT:
  139. *val = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
  140. break;
  141. case MAX77693_BATTERY_RESERVED:
  142. default:
  143. *val = POWER_SUPPLY_HEALTH_UNKNOWN;
  144. break;
  145. }
  146. return 0;
  147. }
  148. static int max77693_get_present(struct regmap *regmap, int *val)
  149. {
  150. unsigned int data;
  151. int ret;
  152. /*
  153. * Read CHG_INT_OK register. High DETBAT bit here should be
  154. * equal to value 0x0 in CHG_DETAILS_01/BAT field.
  155. */
  156. ret = regmap_read(regmap, MAX77693_CHG_REG_CHG_INT_OK, &data);
  157. if (ret < 0)
  158. return ret;
  159. *val = (data & CHG_INT_OK_DETBAT_MASK) ? 0 : 1;
  160. return 0;
  161. }
  162. static int max77693_get_online(struct regmap *regmap, int *val)
  163. {
  164. unsigned int data;
  165. int ret;
  166. ret = regmap_read(regmap, MAX77693_CHG_REG_CHG_INT_OK, &data);
  167. if (ret < 0)
  168. return ret;
  169. *val = (data & CHG_INT_OK_CHGIN_MASK) ? 1 : 0;
  170. return 0;
  171. }
  172. /*
  173. * There are *two* current limit registers:
  174. * - CHGIN limit, which limits the input current from the external charger;
  175. * - Fast charge current limit, which limits the current going to the battery.
  176. */
  177. static int max77693_get_input_current_limit(struct regmap *regmap, int *val)
  178. {
  179. unsigned int data;
  180. int ret;
  181. ret = regmap_read(regmap, MAX77693_CHG_REG_CHG_CNFG_09, &data);
  182. if (ret < 0)
  183. return ret;
  184. data &= CHG_CNFG_09_CHGIN_ILIM_MASK;
  185. data >>= CHG_CNFG_09_CHGIN_ILIM_SHIFT;
  186. if (data <= 0x03)
  187. /* The first four values (0x00..0x03) are 60mA */
  188. *val = 60000;
  189. else
  190. *val = data * 20000; /* 20mA steps */
  191. return 0;
  192. }
  193. static int max77693_get_fast_charge_current(struct regmap *regmap, int *val)
  194. {
  195. unsigned int data;
  196. int ret;
  197. ret = regmap_read(regmap, MAX77693_CHG_REG_CHG_CNFG_02, &data);
  198. if (ret < 0)
  199. return ret;
  200. data &= CHG_CNFG_02_CC_MASK;
  201. data >>= CHG_CNFG_02_CC_SHIFT;
  202. *val = data * 33300; /* 33.3mA steps */
  203. return 0;
  204. }
  205. static enum power_supply_property max77693_charger_props[] = {
  206. POWER_SUPPLY_PROP_STATUS,
  207. POWER_SUPPLY_PROP_CHARGE_TYPE,
  208. POWER_SUPPLY_PROP_HEALTH,
  209. POWER_SUPPLY_PROP_PRESENT,
  210. POWER_SUPPLY_PROP_ONLINE,
  211. POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
  212. POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX,
  213. POWER_SUPPLY_PROP_MODEL_NAME,
  214. POWER_SUPPLY_PROP_MANUFACTURER,
  215. };
  216. static int max77693_charger_get_property(struct power_supply *psy,
  217. enum power_supply_property psp,
  218. union power_supply_propval *val)
  219. {
  220. struct max77693_charger *chg = power_supply_get_drvdata(psy);
  221. struct regmap *regmap = chg->max77693->regmap;
  222. int ret = 0;
  223. switch (psp) {
  224. case POWER_SUPPLY_PROP_STATUS:
  225. ret = max77693_get_charger_state(regmap, &val->intval);
  226. break;
  227. case POWER_SUPPLY_PROP_CHARGE_TYPE:
  228. ret = max77693_get_charge_type(regmap, &val->intval);
  229. break;
  230. case POWER_SUPPLY_PROP_HEALTH:
  231. ret = max77693_get_battery_health(regmap, &val->intval);
  232. break;
  233. case POWER_SUPPLY_PROP_PRESENT:
  234. ret = max77693_get_present(regmap, &val->intval);
  235. break;
  236. case POWER_SUPPLY_PROP_ONLINE:
  237. ret = max77693_get_online(regmap, &val->intval);
  238. break;
  239. case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
  240. ret = max77693_get_input_current_limit(regmap, &val->intval);
  241. break;
  242. case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX:
  243. ret = max77693_get_fast_charge_current(regmap, &val->intval);
  244. break;
  245. case POWER_SUPPLY_PROP_MODEL_NAME:
  246. val->strval = max77693_charger_model;
  247. break;
  248. case POWER_SUPPLY_PROP_MANUFACTURER:
  249. val->strval = max77693_charger_manufacturer;
  250. break;
  251. default:
  252. return -EINVAL;
  253. }
  254. return ret;
  255. }
  256. static const struct power_supply_desc max77693_charger_desc = {
  257. .name = MAX77693_CHARGER_NAME,
  258. .type = POWER_SUPPLY_TYPE_BATTERY,
  259. .properties = max77693_charger_props,
  260. .num_properties = ARRAY_SIZE(max77693_charger_props),
  261. .get_property = max77693_charger_get_property,
  262. };
  263. static ssize_t device_attr_store(struct device *dev,
  264. struct device_attribute *attr, const char *buf, size_t count,
  265. int (*fn)(struct max77693_charger *, unsigned long))
  266. {
  267. struct max77693_charger *chg = dev_get_drvdata(dev);
  268. unsigned long val;
  269. int ret;
  270. ret = kstrtoul(buf, 10, &val);
  271. if (ret)
  272. return ret;
  273. ret = fn(chg, val);
  274. if (ret)
  275. return ret;
  276. return count;
  277. }
  278. static ssize_t fast_charge_timer_show(struct device *dev,
  279. struct device_attribute *attr, char *buf)
  280. {
  281. struct max77693_charger *chg = dev_get_drvdata(dev);
  282. unsigned int data, val;
  283. int ret;
  284. ret = regmap_read(chg->max77693->regmap, MAX77693_CHG_REG_CHG_CNFG_01,
  285. &data);
  286. if (ret < 0)
  287. return ret;
  288. data &= CHG_CNFG_01_FCHGTIME_MASK;
  289. data >>= CHG_CNFG_01_FCHGTIME_SHIFT;
  290. switch (data) {
  291. case 0x1 ... 0x7:
  292. /* Starting from 4 hours, step by 2 hours */
  293. val = 4 + (data - 1) * 2;
  294. break;
  295. case 0x0:
  296. default:
  297. val = 0;
  298. break;
  299. }
  300. return sysfs_emit(buf, "%u\n", val);
  301. }
  302. static int max77693_set_fast_charge_timer(struct max77693_charger *chg,
  303. unsigned long hours)
  304. {
  305. unsigned int data;
  306. /*
  307. * 0x00 - disable
  308. * 0x01 - 4h
  309. * 0x02 - 6h
  310. * ...
  311. * 0x07 - 16h
  312. * Round down odd values.
  313. */
  314. switch (hours) {
  315. case 4 ... 16:
  316. data = (hours - 4) / 2 + 1;
  317. break;
  318. case 0:
  319. /* Disable */
  320. data = 0;
  321. break;
  322. default:
  323. return -EINVAL;
  324. }
  325. data <<= CHG_CNFG_01_FCHGTIME_SHIFT;
  326. return regmap_update_bits(chg->max77693->regmap,
  327. MAX77693_CHG_REG_CHG_CNFG_01,
  328. CHG_CNFG_01_FCHGTIME_MASK, data);
  329. }
  330. static ssize_t fast_charge_timer_store(struct device *dev,
  331. struct device_attribute *attr, const char *buf, size_t count)
  332. {
  333. return device_attr_store(dev, attr, buf, count,
  334. max77693_set_fast_charge_timer);
  335. }
  336. static ssize_t top_off_threshold_current_show(struct device *dev,
  337. struct device_attribute *attr, char *buf)
  338. {
  339. struct max77693_charger *chg = dev_get_drvdata(dev);
  340. unsigned int data, val;
  341. int ret;
  342. ret = regmap_read(chg->max77693->regmap, MAX77693_CHG_REG_CHG_CNFG_03,
  343. &data);
  344. if (ret < 0)
  345. return ret;
  346. data &= CHG_CNFG_03_TOITH_MASK;
  347. data >>= CHG_CNFG_03_TOITH_SHIFT;
  348. if (data <= 0x04)
  349. val = 100000 + data * 25000;
  350. else
  351. val = data * 50000;
  352. return sysfs_emit(buf, "%u\n", val);
  353. }
  354. static int max77693_set_top_off_threshold_current(struct max77693_charger *chg,
  355. unsigned long uamp)
  356. {
  357. unsigned int data;
  358. if (uamp < 100000 || uamp > 350000)
  359. return -EINVAL;
  360. if (uamp <= 200000)
  361. data = (uamp - 100000) / 25000;
  362. else
  363. /* (200000, 350000> */
  364. data = uamp / 50000;
  365. data <<= CHG_CNFG_03_TOITH_SHIFT;
  366. return regmap_update_bits(chg->max77693->regmap,
  367. MAX77693_CHG_REG_CHG_CNFG_03,
  368. CHG_CNFG_03_TOITH_MASK, data);
  369. }
  370. static ssize_t top_off_threshold_current_store(struct device *dev,
  371. struct device_attribute *attr, const char *buf, size_t count)
  372. {
  373. return device_attr_store(dev, attr, buf, count,
  374. max77693_set_top_off_threshold_current);
  375. }
  376. static ssize_t top_off_timer_show(struct device *dev,
  377. struct device_attribute *attr, char *buf)
  378. {
  379. struct max77693_charger *chg = dev_get_drvdata(dev);
  380. unsigned int data, val;
  381. int ret;
  382. ret = regmap_read(chg->max77693->regmap, MAX77693_CHG_REG_CHG_CNFG_03,
  383. &data);
  384. if (ret < 0)
  385. return ret;
  386. data &= CHG_CNFG_03_TOTIME_MASK;
  387. data >>= CHG_CNFG_03_TOTIME_SHIFT;
  388. val = data * 10;
  389. return sysfs_emit(buf, "%u\n", val);
  390. }
  391. static int max77693_set_top_off_timer(struct max77693_charger *chg,
  392. unsigned long minutes)
  393. {
  394. unsigned int data;
  395. if (minutes > 70)
  396. return -EINVAL;
  397. data = minutes / 10;
  398. data <<= CHG_CNFG_03_TOTIME_SHIFT;
  399. return regmap_update_bits(chg->max77693->regmap,
  400. MAX77693_CHG_REG_CHG_CNFG_03,
  401. CHG_CNFG_03_TOTIME_MASK, data);
  402. }
  403. static ssize_t top_off_timer_store(struct device *dev,
  404. struct device_attribute *attr, const char *buf, size_t count)
  405. {
  406. return device_attr_store(dev, attr, buf, count,
  407. max77693_set_top_off_timer);
  408. }
  409. static DEVICE_ATTR_RW(fast_charge_timer);
  410. static DEVICE_ATTR_RW(top_off_threshold_current);
  411. static DEVICE_ATTR_RW(top_off_timer);
  412. static int max77693_set_constant_volt(struct max77693_charger *chg,
  413. unsigned int uvolt)
  414. {
  415. unsigned int data;
  416. /*
  417. * 0x00 - 3.650 V
  418. * 0x01 - 3.675 V
  419. * ...
  420. * 0x1b - 4.325 V
  421. * 0x1c - 4.340 V
  422. * 0x1d - 4.350 V
  423. * 0x1e - 4.375 V
  424. * 0x1f - 4.400 V
  425. */
  426. if (uvolt >= 3650000 && uvolt < 4340000)
  427. data = (uvolt - 3650000) / 25000;
  428. else if (uvolt >= 4340000 && uvolt < 4350000)
  429. data = 0x1c;
  430. else if (uvolt >= 4350000 && uvolt <= 4400000)
  431. data = 0x1d + (uvolt - 4350000) / 25000;
  432. else {
  433. dev_err(chg->dev, "Wrong value for charging constant voltage\n");
  434. return -EINVAL;
  435. }
  436. data <<= CHG_CNFG_04_CHGCVPRM_SHIFT;
  437. dev_dbg(chg->dev, "Charging constant voltage: %u (0x%x)\n", uvolt,
  438. data);
  439. return regmap_update_bits(chg->max77693->regmap,
  440. MAX77693_CHG_REG_CHG_CNFG_04,
  441. CHG_CNFG_04_CHGCVPRM_MASK, data);
  442. }
  443. static int max77693_set_min_system_volt(struct max77693_charger *chg,
  444. unsigned int uvolt)
  445. {
  446. unsigned int data;
  447. if (uvolt < 3000000 || uvolt > 3700000) {
  448. dev_err(chg->dev, "Wrong value for minimum system regulation voltage\n");
  449. return -EINVAL;
  450. }
  451. data = (uvolt - 3000000) / 100000;
  452. data <<= CHG_CNFG_04_MINVSYS_SHIFT;
  453. dev_dbg(chg->dev, "Minimum system regulation voltage: %u (0x%x)\n",
  454. uvolt, data);
  455. return regmap_update_bits(chg->max77693->regmap,
  456. MAX77693_CHG_REG_CHG_CNFG_04,
  457. CHG_CNFG_04_MINVSYS_MASK, data);
  458. }
  459. static int max77693_set_thermal_regulation_temp(struct max77693_charger *chg,
  460. unsigned int cels)
  461. {
  462. unsigned int data;
  463. switch (cels) {
  464. case 70:
  465. case 85:
  466. case 100:
  467. case 115:
  468. data = (cels - 70) / 15;
  469. break;
  470. default:
  471. dev_err(chg->dev, "Wrong value for thermal regulation loop temperature\n");
  472. return -EINVAL;
  473. }
  474. data <<= CHG_CNFG_07_REGTEMP_SHIFT;
  475. dev_dbg(chg->dev, "Thermal regulation loop temperature: %u (0x%x)\n",
  476. cels, data);
  477. return regmap_update_bits(chg->max77693->regmap,
  478. MAX77693_CHG_REG_CHG_CNFG_07,
  479. CHG_CNFG_07_REGTEMP_MASK, data);
  480. }
  481. static int max77693_set_batttery_overcurrent(struct max77693_charger *chg,
  482. unsigned int uamp)
  483. {
  484. unsigned int data;
  485. if (uamp && (uamp < 2000000 || uamp > 3500000)) {
  486. dev_err(chg->dev, "Wrong value for battery overcurrent\n");
  487. return -EINVAL;
  488. }
  489. if (uamp)
  490. data = ((uamp - 2000000) / 250000) + 1;
  491. else
  492. data = 0; /* disable */
  493. data <<= CHG_CNFG_12_B2SOVRC_SHIFT;
  494. dev_dbg(chg->dev, "Battery overcurrent: %u (0x%x)\n", uamp, data);
  495. return regmap_update_bits(chg->max77693->regmap,
  496. MAX77693_CHG_REG_CHG_CNFG_12,
  497. CHG_CNFG_12_B2SOVRC_MASK, data);
  498. }
  499. static int max77693_set_charge_input_threshold_volt(struct max77693_charger *chg,
  500. unsigned int uvolt)
  501. {
  502. unsigned int data;
  503. switch (uvolt) {
  504. case 4300000:
  505. data = 0x0;
  506. break;
  507. case 4700000:
  508. case 4800000:
  509. case 4900000:
  510. data = (uvolt - 4700000) / 100000;
  511. break;
  512. default:
  513. dev_err(chg->dev, "Wrong value for charge input voltage regulation threshold\n");
  514. return -EINVAL;
  515. }
  516. data <<= CHG_CNFG_12_VCHGINREG_SHIFT;
  517. dev_dbg(chg->dev, "Charge input voltage regulation threshold: %u (0x%x)\n",
  518. uvolt, data);
  519. return regmap_update_bits(chg->max77693->regmap,
  520. MAX77693_CHG_REG_CHG_CNFG_12,
  521. CHG_CNFG_12_VCHGINREG_MASK, data);
  522. }
  523. /*
  524. * Sets charger registers to proper and safe default values.
  525. */
  526. static int max77693_reg_init(struct max77693_charger *chg)
  527. {
  528. int ret;
  529. unsigned int data;
  530. /* Unlock charger register protection */
  531. data = (0x3 << CHG_CNFG_06_CHGPROT_SHIFT);
  532. ret = regmap_update_bits(chg->max77693->regmap,
  533. MAX77693_CHG_REG_CHG_CNFG_06,
  534. CHG_CNFG_06_CHGPROT_MASK, data);
  535. if (ret) {
  536. dev_err(chg->dev, "Error unlocking registers: %d\n", ret);
  537. return ret;
  538. }
  539. ret = max77693_set_fast_charge_timer(chg, DEFAULT_FAST_CHARGE_TIMER);
  540. if (ret)
  541. return ret;
  542. ret = max77693_set_top_off_threshold_current(chg,
  543. DEFAULT_TOP_OFF_THRESHOLD_CURRENT);
  544. if (ret)
  545. return ret;
  546. ret = max77693_set_top_off_timer(chg, DEFAULT_TOP_OFF_TIMER);
  547. if (ret)
  548. return ret;
  549. ret = max77693_set_constant_volt(chg, chg->constant_volt);
  550. if (ret)
  551. return ret;
  552. ret = max77693_set_min_system_volt(chg, chg->min_system_volt);
  553. if (ret)
  554. return ret;
  555. ret = max77693_set_thermal_regulation_temp(chg,
  556. chg->thermal_regulation_temp);
  557. if (ret)
  558. return ret;
  559. ret = max77693_set_batttery_overcurrent(chg, chg->batttery_overcurrent);
  560. if (ret)
  561. return ret;
  562. return max77693_set_charge_input_threshold_volt(chg,
  563. chg->charge_input_threshold_volt);
  564. }
  565. #ifdef CONFIG_OF
  566. static int max77693_dt_init(struct device *dev, struct max77693_charger *chg)
  567. {
  568. struct device_node *np = dev->of_node;
  569. if (!np) {
  570. dev_err(dev, "no charger OF node\n");
  571. return -EINVAL;
  572. }
  573. if (of_property_read_u32(np, "maxim,constant-microvolt",
  574. &chg->constant_volt))
  575. chg->constant_volt = DEFAULT_CONSTANT_VOLT;
  576. if (of_property_read_u32(np, "maxim,min-system-microvolt",
  577. &chg->min_system_volt))
  578. chg->min_system_volt = DEFAULT_MIN_SYSTEM_VOLT;
  579. if (of_property_read_u32(np, "maxim,thermal-regulation-celsius",
  580. &chg->thermal_regulation_temp))
  581. chg->thermal_regulation_temp = DEFAULT_THERMAL_REGULATION_TEMP;
  582. if (of_property_read_u32(np, "maxim,battery-overcurrent-microamp",
  583. &chg->batttery_overcurrent))
  584. chg->batttery_overcurrent = DEFAULT_BATTERY_OVERCURRENT;
  585. if (of_property_read_u32(np, "maxim,charge-input-threshold-microvolt",
  586. &chg->charge_input_threshold_volt))
  587. chg->charge_input_threshold_volt =
  588. DEFAULT_CHARGER_INPUT_THRESHOLD_VOLT;
  589. return 0;
  590. }
  591. #else /* CONFIG_OF */
  592. static int max77693_dt_init(struct device *dev, struct max77693_charger *chg)
  593. {
  594. return 0;
  595. }
  596. #endif /* CONFIG_OF */
  597. static int max77693_charger_probe(struct platform_device *pdev)
  598. {
  599. struct max77693_charger *chg;
  600. struct power_supply_config psy_cfg = {};
  601. struct max77693_dev *max77693 = dev_get_drvdata(pdev->dev.parent);
  602. int ret;
  603. chg = devm_kzalloc(&pdev->dev, sizeof(*chg), GFP_KERNEL);
  604. if (!chg)
  605. return -ENOMEM;
  606. platform_set_drvdata(pdev, chg);
  607. chg->dev = &pdev->dev;
  608. chg->max77693 = max77693;
  609. ret = max77693_dt_init(&pdev->dev, chg);
  610. if (ret)
  611. return ret;
  612. ret = max77693_reg_init(chg);
  613. if (ret)
  614. return ret;
  615. psy_cfg.drv_data = chg;
  616. ret = device_create_file(&pdev->dev, &dev_attr_fast_charge_timer);
  617. if (ret) {
  618. dev_err(&pdev->dev, "failed: create fast charge timer sysfs entry\n");
  619. goto err;
  620. }
  621. ret = device_create_file(&pdev->dev,
  622. &dev_attr_top_off_threshold_current);
  623. if (ret) {
  624. dev_err(&pdev->dev, "failed: create top off current sysfs entry\n");
  625. goto err;
  626. }
  627. ret = device_create_file(&pdev->dev, &dev_attr_top_off_timer);
  628. if (ret) {
  629. dev_err(&pdev->dev, "failed: create top off timer sysfs entry\n");
  630. goto err;
  631. }
  632. chg->charger = devm_power_supply_register(&pdev->dev,
  633. &max77693_charger_desc,
  634. &psy_cfg);
  635. if (IS_ERR(chg->charger)) {
  636. dev_err(&pdev->dev, "failed: power supply register\n");
  637. ret = PTR_ERR(chg->charger);
  638. goto err;
  639. }
  640. return 0;
  641. err:
  642. device_remove_file(&pdev->dev, &dev_attr_top_off_timer);
  643. device_remove_file(&pdev->dev, &dev_attr_top_off_threshold_current);
  644. device_remove_file(&pdev->dev, &dev_attr_fast_charge_timer);
  645. return ret;
  646. }
  647. static void max77693_charger_remove(struct platform_device *pdev)
  648. {
  649. device_remove_file(&pdev->dev, &dev_attr_top_off_timer);
  650. device_remove_file(&pdev->dev, &dev_attr_top_off_threshold_current);
  651. device_remove_file(&pdev->dev, &dev_attr_fast_charge_timer);
  652. }
  653. static const struct platform_device_id max77693_charger_id[] = {
  654. { "max77693-charger", 0, },
  655. { }
  656. };
  657. MODULE_DEVICE_TABLE(platform, max77693_charger_id);
  658. static struct platform_driver max77693_charger_driver = {
  659. .driver = {
  660. .name = "max77693-charger",
  661. },
  662. .probe = max77693_charger_probe,
  663. .remove_new = max77693_charger_remove,
  664. .id_table = max77693_charger_id,
  665. };
  666. module_platform_driver(max77693_charger_driver);
  667. MODULE_AUTHOR("Krzysztof Kozlowski <krzk@kernel.org>");
  668. MODULE_DESCRIPTION("Maxim 77693 charger driver");
  669. MODULE_LICENSE("GPL");