max77693_charger.c 19 KB

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