max14577_charger.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612
  1. /*
  2. * max14577_charger.c - Battery charger driver for the Maxim 14577/77836
  3. *
  4. * Copyright (C) 2013,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/mfd/max14577-private.h>
  21. #include <linux/mfd/max14577.h>
  22. struct max14577_charger {
  23. struct device *dev;
  24. struct max14577 *max14577;
  25. struct power_supply charger;
  26. unsigned int charging_state;
  27. unsigned int battery_state;
  28. struct max14577_charger_platform_data *pdata;
  29. };
  30. /*
  31. * Helper function for mapping values of STATUS2/CHGTYP register on max14577
  32. * and max77836 chipsets to enum maxim_muic_charger_type.
  33. */
  34. static enum max14577_muic_charger_type maxim_get_charger_type(
  35. enum maxim_device_type dev_type, u8 val) {
  36. switch (val) {
  37. case MAX14577_CHARGER_TYPE_NONE:
  38. case MAX14577_CHARGER_TYPE_USB:
  39. case MAX14577_CHARGER_TYPE_DOWNSTREAM_PORT:
  40. case MAX14577_CHARGER_TYPE_DEDICATED_CHG:
  41. case MAX14577_CHARGER_TYPE_SPECIAL_500MA:
  42. case MAX14577_CHARGER_TYPE_SPECIAL_1A:
  43. return val;
  44. case MAX14577_CHARGER_TYPE_DEAD_BATTERY:
  45. case MAX14577_CHARGER_TYPE_RESERVED:
  46. if (dev_type == MAXIM_DEVICE_TYPE_MAX77836)
  47. val |= 0x8;
  48. return val;
  49. default:
  50. WARN_ONCE(1, "max14577: Unsupported chgtyp register value 0x%02x", val);
  51. return val;
  52. }
  53. }
  54. static int max14577_get_charger_state(struct max14577_charger *chg)
  55. {
  56. struct regmap *rmap = chg->max14577->regmap;
  57. int state = POWER_SUPPLY_STATUS_DISCHARGING;
  58. u8 reg_data;
  59. /*
  60. * Charging occurs only if:
  61. * - CHGCTRL2/MBCHOSTEN == 1
  62. * - STATUS2/CGMBC == 1
  63. *
  64. * TODO:
  65. * - handle FULL after Top-off timer (EOC register may be off
  66. * and the charger won't be charging although MBCHOSTEN is on)
  67. * - handle properly dead-battery charging (respect timer)
  68. * - handle timers (fast-charge and prequal) /MBCCHGERR/
  69. */
  70. max14577_read_reg(rmap, MAX14577_CHG_REG_CHG_CTRL2, &reg_data);
  71. if ((reg_data & CHGCTRL2_MBCHOSTEN_MASK) == 0)
  72. goto state_set;
  73. max14577_read_reg(rmap, MAX14577_CHG_REG_STATUS3, &reg_data);
  74. if (reg_data & STATUS3_CGMBC_MASK) {
  75. /* Charger or USB-cable is connected */
  76. if (reg_data & STATUS3_EOC_MASK)
  77. state = POWER_SUPPLY_STATUS_FULL;
  78. else
  79. state = POWER_SUPPLY_STATUS_CHARGING;
  80. goto state_set;
  81. }
  82. state_set:
  83. chg->charging_state = state;
  84. return state;
  85. }
  86. /*
  87. * Supported charge types:
  88. * - POWER_SUPPLY_CHARGE_TYPE_NONE
  89. * - POWER_SUPPLY_CHARGE_TYPE_FAST
  90. */
  91. static int max14577_get_charge_type(struct max14577_charger *chg)
  92. {
  93. /*
  94. * TODO: CHARGE_TYPE_TRICKLE (VCHGR_RC or EOC)?
  95. * As spec says:
  96. * [after reaching EOC interrupt]
  97. * "When the battery is fully charged, the 30-minute (typ)
  98. * top-off timer starts. The device continues to trickle
  99. * charge the battery until the top-off timer runs out."
  100. */
  101. if (max14577_get_charger_state(chg) == POWER_SUPPLY_STATUS_CHARGING)
  102. return POWER_SUPPLY_CHARGE_TYPE_FAST;
  103. return POWER_SUPPLY_CHARGE_TYPE_NONE;
  104. }
  105. static int max14577_get_online(struct max14577_charger *chg)
  106. {
  107. struct regmap *rmap = chg->max14577->regmap;
  108. u8 reg_data;
  109. enum max14577_muic_charger_type chg_type;
  110. max14577_read_reg(rmap, MAX14577_MUIC_REG_STATUS2, &reg_data);
  111. reg_data = ((reg_data & STATUS2_CHGTYP_MASK) >> STATUS2_CHGTYP_SHIFT);
  112. chg_type = maxim_get_charger_type(chg->max14577->dev_type, reg_data);
  113. switch (chg_type) {
  114. case MAX14577_CHARGER_TYPE_USB:
  115. case MAX14577_CHARGER_TYPE_DEDICATED_CHG:
  116. case MAX14577_CHARGER_TYPE_SPECIAL_500MA:
  117. case MAX14577_CHARGER_TYPE_SPECIAL_1A:
  118. case MAX14577_CHARGER_TYPE_DEAD_BATTERY:
  119. case MAX77836_CHARGER_TYPE_SPECIAL_BIAS:
  120. return 1;
  121. case MAX14577_CHARGER_TYPE_NONE:
  122. case MAX14577_CHARGER_TYPE_DOWNSTREAM_PORT:
  123. case MAX14577_CHARGER_TYPE_RESERVED:
  124. case MAX77836_CHARGER_TYPE_RESERVED:
  125. default:
  126. return 0;
  127. }
  128. }
  129. /*
  130. * Supported health statuses:
  131. * - POWER_SUPPLY_HEALTH_DEAD
  132. * - POWER_SUPPLY_HEALTH_OVERVOLTAGE
  133. * - POWER_SUPPLY_HEALTH_GOOD
  134. */
  135. static int max14577_get_battery_health(struct max14577_charger *chg)
  136. {
  137. struct regmap *rmap = chg->max14577->regmap;
  138. int state = POWER_SUPPLY_HEALTH_GOOD;
  139. u8 reg_data;
  140. enum max14577_muic_charger_type chg_type;
  141. max14577_read_reg(rmap, MAX14577_MUIC_REG_STATUS2, &reg_data);
  142. reg_data = ((reg_data & STATUS2_CHGTYP_MASK) >> STATUS2_CHGTYP_SHIFT);
  143. chg_type = maxim_get_charger_type(chg->max14577->dev_type, reg_data);
  144. if (chg_type == MAX14577_CHARGER_TYPE_DEAD_BATTERY) {
  145. state = POWER_SUPPLY_HEALTH_DEAD;
  146. goto state_set;
  147. }
  148. max14577_read_reg(rmap, MAX14577_CHG_REG_STATUS3, &reg_data);
  149. if (reg_data & STATUS3_OVP_MASK) {
  150. state = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
  151. goto state_set;
  152. }
  153. state_set:
  154. chg->battery_state = state;
  155. return state;
  156. }
  157. /*
  158. * Always returns 1.
  159. * The max14577 chip doesn't report any status of battery presence.
  160. * Lets assume that it will always be used with some battery.
  161. */
  162. static int max14577_get_present(struct max14577_charger *chg)
  163. {
  164. return 1;
  165. }
  166. static int max14577_set_fast_charge_timer(struct max14577_charger *chg,
  167. unsigned long hours)
  168. {
  169. u8 reg_data;
  170. switch (hours) {
  171. case 5 ... 7:
  172. reg_data = hours - 3;
  173. break;
  174. case 0:
  175. /* Disable */
  176. reg_data = 0x7;
  177. break;
  178. default:
  179. dev_err(chg->dev, "Wrong value for Fast-Charge Timer: %lu\n",
  180. hours);
  181. return -EINVAL;
  182. }
  183. reg_data <<= CHGCTRL1_TCHW_SHIFT;
  184. return max14577_update_reg(chg->max14577->regmap,
  185. MAX14577_REG_CHGCTRL1, CHGCTRL1_TCHW_MASK, reg_data);
  186. }
  187. static int max14577_init_constant_voltage(struct max14577_charger *chg,
  188. unsigned int uvolt)
  189. {
  190. u8 reg_data;
  191. if (uvolt < MAXIM_CHARGER_CONSTANT_VOLTAGE_MIN ||
  192. uvolt > MAXIM_CHARGER_CONSTANT_VOLTAGE_MAX)
  193. return -EINVAL;
  194. if (uvolt == 4200000)
  195. reg_data = 0x0;
  196. else if (uvolt == MAXIM_CHARGER_CONSTANT_VOLTAGE_MAX)
  197. reg_data = 0x1f;
  198. else if (uvolt <= 4280000) {
  199. unsigned int val = uvolt;
  200. val -= MAXIM_CHARGER_CONSTANT_VOLTAGE_MIN;
  201. val /= MAXIM_CHARGER_CONSTANT_VOLTAGE_STEP;
  202. if (uvolt <= 4180000)
  203. reg_data = 0x1 + val;
  204. else
  205. reg_data = val; /* Fix for gap between 4.18V and 4.22V */
  206. } else
  207. return -EINVAL;
  208. reg_data <<= CHGCTRL3_MBCCVWRC_SHIFT;
  209. return max14577_write_reg(chg->max14577->regmap,
  210. MAX14577_CHG_REG_CHG_CTRL3, reg_data);
  211. }
  212. static int max14577_init_eoc(struct max14577_charger *chg,
  213. unsigned int uamp)
  214. {
  215. unsigned int current_bits = 0xf;
  216. u8 reg_data;
  217. switch (chg->max14577->dev_type) {
  218. case MAXIM_DEVICE_TYPE_MAX77836:
  219. if (uamp < 5000)
  220. return -EINVAL; /* Requested current is too low */
  221. if (uamp >= 7500 && uamp < 10000)
  222. current_bits = 0x0;
  223. else if (uamp <= 50000) {
  224. /* <5000, 7499> and <10000, 50000> */
  225. current_bits = uamp / 5000;
  226. } else {
  227. uamp = min(uamp, 100000U) - 50000U;
  228. current_bits = 0xa + uamp / 10000;
  229. }
  230. break;
  231. case MAXIM_DEVICE_TYPE_MAX14577:
  232. default:
  233. if (uamp < MAX14577_CHARGER_EOC_CURRENT_LIMIT_MIN)
  234. return -EINVAL; /* Requested current is too low */
  235. uamp = min(uamp, MAX14577_CHARGER_EOC_CURRENT_LIMIT_MAX);
  236. uamp -= MAX14577_CHARGER_EOC_CURRENT_LIMIT_MIN;
  237. current_bits = uamp / MAX14577_CHARGER_EOC_CURRENT_LIMIT_STEP;
  238. break;
  239. }
  240. reg_data = current_bits << CHGCTRL5_EOCS_SHIFT;
  241. return max14577_update_reg(chg->max14577->regmap,
  242. MAX14577_CHG_REG_CHG_CTRL5, CHGCTRL5_EOCS_MASK,
  243. reg_data);
  244. }
  245. static int max14577_init_fast_charge(struct max14577_charger *chg,
  246. unsigned int uamp)
  247. {
  248. u8 reg_data;
  249. int ret;
  250. const struct maxim_charger_current *limits =
  251. &maxim_charger_currents[chg->max14577->dev_type];
  252. ret = maxim_charger_calc_reg_current(limits, uamp, uamp, &reg_data);
  253. if (ret) {
  254. dev_err(chg->dev, "Wrong value for fast charge: %u\n", uamp);
  255. return ret;
  256. }
  257. return max14577_update_reg(chg->max14577->regmap,
  258. MAX14577_CHG_REG_CHG_CTRL4,
  259. CHGCTRL4_MBCICHWRCL_MASK | CHGCTRL4_MBCICHWRCH_MASK,
  260. reg_data);
  261. }
  262. /*
  263. * Sets charger registers to proper and safe default values.
  264. * Some of these values are equal to defaults in MAX14577E
  265. * data sheet but there are minor differences.
  266. */
  267. static int max14577_charger_reg_init(struct max14577_charger *chg)
  268. {
  269. struct regmap *rmap = chg->max14577->regmap;
  270. u8 reg_data;
  271. int ret;
  272. /*
  273. * Charger-Type Manual Detection, default off (set CHGTYPMAN to 0)
  274. * Charger-Detection Enable, default on (set CHGDETEN to 1)
  275. * Combined mask of CHGDETEN and CHGTYPMAN will zero the CHGTYPMAN bit
  276. */
  277. reg_data = 0x1 << CDETCTRL1_CHGDETEN_SHIFT;
  278. max14577_update_reg(rmap, MAX14577_REG_CDETCTRL1,
  279. CDETCTRL1_CHGDETEN_MASK | CDETCTRL1_CHGTYPMAN_MASK,
  280. reg_data);
  281. /*
  282. * Wall-Adapter Rapid Charge, default on
  283. * Battery-Charger, default on
  284. */
  285. reg_data = 0x1 << CHGCTRL2_VCHGR_RC_SHIFT;
  286. reg_data |= 0x1 << CHGCTRL2_MBCHOSTEN_SHIFT;
  287. max14577_write_reg(rmap, MAX14577_REG_CHGCTRL2, reg_data);
  288. /* Auto Charging Stop, default off */
  289. reg_data = 0x0 << CHGCTRL6_AUTOSTOP_SHIFT;
  290. max14577_write_reg(rmap, MAX14577_REG_CHGCTRL6, reg_data);
  291. ret = max14577_init_constant_voltage(chg, chg->pdata->constant_uvolt);
  292. if (ret)
  293. return ret;
  294. ret = max14577_init_eoc(chg, chg->pdata->eoc_uamp);
  295. if (ret)
  296. return ret;
  297. ret = max14577_init_fast_charge(chg, chg->pdata->fast_charge_uamp);
  298. if (ret)
  299. return ret;
  300. ret = max14577_set_fast_charge_timer(chg,
  301. MAXIM_CHARGER_FAST_CHARGE_TIMER_DEFAULT);
  302. if (ret)
  303. return ret;
  304. /* Initialize Overvoltage-Protection Threshold */
  305. switch (chg->pdata->ovp_uvolt) {
  306. case 7500000:
  307. reg_data = 0x0;
  308. break;
  309. case 6000000:
  310. case 6500000:
  311. case 7000000:
  312. reg_data = 0x1 + (chg->pdata->ovp_uvolt - 6000000) / 500000;
  313. break;
  314. default:
  315. dev_err(chg->dev, "Wrong value for OVP: %u\n",
  316. chg->pdata->ovp_uvolt);
  317. return -EINVAL;
  318. }
  319. reg_data <<= CHGCTRL7_OTPCGHCVS_SHIFT;
  320. max14577_write_reg(rmap, MAX14577_REG_CHGCTRL7, reg_data);
  321. return 0;
  322. }
  323. /* Support property from charger */
  324. static enum power_supply_property max14577_charger_props[] = {
  325. POWER_SUPPLY_PROP_STATUS,
  326. POWER_SUPPLY_PROP_CHARGE_TYPE,
  327. POWER_SUPPLY_PROP_HEALTH,
  328. POWER_SUPPLY_PROP_PRESENT,
  329. POWER_SUPPLY_PROP_ONLINE,
  330. POWER_SUPPLY_PROP_MODEL_NAME,
  331. POWER_SUPPLY_PROP_MANUFACTURER,
  332. };
  333. static const char * const model_names[] = {
  334. [MAXIM_DEVICE_TYPE_UNKNOWN] = "MAX14577-like",
  335. [MAXIM_DEVICE_TYPE_MAX14577] = "MAX14577",
  336. [MAXIM_DEVICE_TYPE_MAX77836] = "MAX77836",
  337. };
  338. static const char *manufacturer = "Maxim Integrated";
  339. static int max14577_charger_get_property(struct power_supply *psy,
  340. enum power_supply_property psp,
  341. union power_supply_propval *val)
  342. {
  343. struct max14577_charger *chg = container_of(psy,
  344. struct max14577_charger,
  345. charger);
  346. int ret = 0;
  347. switch (psp) {
  348. case POWER_SUPPLY_PROP_STATUS:
  349. val->intval = max14577_get_charger_state(chg);
  350. break;
  351. case POWER_SUPPLY_PROP_CHARGE_TYPE:
  352. val->intval = max14577_get_charge_type(chg);
  353. break;
  354. case POWER_SUPPLY_PROP_HEALTH:
  355. val->intval = max14577_get_battery_health(chg);
  356. break;
  357. case POWER_SUPPLY_PROP_PRESENT:
  358. val->intval = max14577_get_present(chg);
  359. break;
  360. case POWER_SUPPLY_PROP_ONLINE:
  361. val->intval = max14577_get_online(chg);
  362. break;
  363. case POWER_SUPPLY_PROP_MODEL_NAME:
  364. BUILD_BUG_ON(ARRAY_SIZE(model_names) != MAXIM_DEVICE_TYPE_NUM);
  365. val->strval = model_names[chg->max14577->dev_type];
  366. break;
  367. case POWER_SUPPLY_PROP_MANUFACTURER:
  368. val->strval = manufacturer;
  369. break;
  370. default:
  371. return -EINVAL;
  372. }
  373. return ret;
  374. }
  375. #ifdef CONFIG_OF
  376. static struct max14577_charger_platform_data *max14577_charger_dt_init(
  377. struct platform_device *pdev)
  378. {
  379. struct max14577_charger_platform_data *pdata;
  380. struct device_node *np = pdev->dev.of_node;
  381. int ret;
  382. if (!np) {
  383. dev_err(&pdev->dev, "No charger OF node\n");
  384. return ERR_PTR(-EINVAL);
  385. }
  386. pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
  387. if (!pdata)
  388. return ERR_PTR(-ENOMEM);
  389. ret = of_property_read_u32(np, "maxim,constant-uvolt",
  390. &pdata->constant_uvolt);
  391. if (ret) {
  392. dev_err(&pdev->dev, "Cannot parse maxim,constant-uvolt field from DT\n");
  393. return ERR_PTR(ret);
  394. }
  395. ret = of_property_read_u32(np, "maxim,fast-charge-uamp",
  396. &pdata->fast_charge_uamp);
  397. if (ret) {
  398. dev_err(&pdev->dev, "Cannot parse maxim,fast-charge-uamp field from DT\n");
  399. return ERR_PTR(ret);
  400. }
  401. ret = of_property_read_u32(np, "maxim,eoc-uamp", &pdata->eoc_uamp);
  402. if (ret) {
  403. dev_err(&pdev->dev, "Cannot parse maxim,eoc-uamp field from DT\n");
  404. return ERR_PTR(ret);
  405. }
  406. ret = of_property_read_u32(np, "maxim,ovp-uvolt", &pdata->ovp_uvolt);
  407. if (ret) {
  408. dev_err(&pdev->dev, "Cannot parse maxim,ovp-uvolt field from DT\n");
  409. return ERR_PTR(ret);
  410. }
  411. return pdata;
  412. }
  413. #else /* CONFIG_OF */
  414. static struct max14577_charger_platform_data *max14577_charger_dt_init(
  415. struct platform_device *pdev)
  416. {
  417. return NULL;
  418. }
  419. #endif /* CONFIG_OF */
  420. static ssize_t show_fast_charge_timer(struct device *dev,
  421. struct device_attribute *attr, char *buf)
  422. {
  423. struct max14577_charger *chg = dev_get_drvdata(dev);
  424. u8 reg_data;
  425. int ret;
  426. unsigned int val;
  427. ret = max14577_read_reg(chg->max14577->regmap, MAX14577_REG_CHGCTRL1,
  428. &reg_data);
  429. if (ret)
  430. return ret;
  431. reg_data &= CHGCTRL1_TCHW_MASK;
  432. reg_data >>= CHGCTRL1_TCHW_SHIFT;
  433. switch (reg_data) {
  434. case 0x2 ... 0x4:
  435. val = reg_data + 3;
  436. break;
  437. case 0x7:
  438. val = 0;
  439. break;
  440. default:
  441. val = 5;
  442. break;
  443. }
  444. return scnprintf(buf, PAGE_SIZE, "%u\n", val);
  445. }
  446. static ssize_t store_fast_charge_timer(struct device *dev,
  447. struct device_attribute *attr, const char *buf, size_t count)
  448. {
  449. struct max14577_charger *chg = dev_get_drvdata(dev);
  450. unsigned long val;
  451. int ret;
  452. ret = kstrtoul(buf, 10, &val);
  453. if (ret)
  454. return ret;
  455. ret = max14577_set_fast_charge_timer(chg, val);
  456. if (ret)
  457. return ret;
  458. return count;
  459. }
  460. static DEVICE_ATTR(fast_charge_timer, S_IRUGO | S_IWUSR,
  461. show_fast_charge_timer, store_fast_charge_timer);
  462. static int max14577_charger_probe(struct platform_device *pdev)
  463. {
  464. struct max14577_charger *chg;
  465. struct max14577 *max14577 = dev_get_drvdata(pdev->dev.parent);
  466. int ret;
  467. chg = devm_kzalloc(&pdev->dev, sizeof(*chg), GFP_KERNEL);
  468. if (!chg)
  469. return -ENOMEM;
  470. platform_set_drvdata(pdev, chg);
  471. chg->dev = &pdev->dev;
  472. chg->max14577 = max14577;
  473. chg->pdata = max14577_charger_dt_init(pdev);
  474. if (IS_ERR_OR_NULL(chg->pdata))
  475. return PTR_ERR(chg->pdata);
  476. ret = max14577_charger_reg_init(chg);
  477. if (ret)
  478. return ret;
  479. chg->charger.name = "max14577-charger",
  480. chg->charger.type = POWER_SUPPLY_TYPE_BATTERY,
  481. chg->charger.properties = max14577_charger_props,
  482. chg->charger.num_properties = ARRAY_SIZE(max14577_charger_props),
  483. chg->charger.get_property = max14577_charger_get_property,
  484. ret = device_create_file(&pdev->dev, &dev_attr_fast_charge_timer);
  485. if (ret) {
  486. dev_err(&pdev->dev, "failed: create sysfs entry\n");
  487. return ret;
  488. }
  489. ret = power_supply_register(&pdev->dev, &chg->charger);
  490. if (ret) {
  491. dev_err(&pdev->dev, "failed: power supply register\n");
  492. goto err;
  493. }
  494. /* Check for valid values for charger */
  495. BUILD_BUG_ON(MAX14577_CHARGER_EOC_CURRENT_LIMIT_MIN +
  496. MAX14577_CHARGER_EOC_CURRENT_LIMIT_STEP * 0xf !=
  497. MAX14577_CHARGER_EOC_CURRENT_LIMIT_MAX);
  498. return 0;
  499. err:
  500. device_remove_file(&pdev->dev, &dev_attr_fast_charge_timer);
  501. return ret;
  502. }
  503. static int max14577_charger_remove(struct platform_device *pdev)
  504. {
  505. struct max14577_charger *chg = platform_get_drvdata(pdev);
  506. device_remove_file(&pdev->dev, &dev_attr_fast_charge_timer);
  507. power_supply_unregister(&chg->charger);
  508. return 0;
  509. }
  510. static const struct platform_device_id max14577_charger_id[] = {
  511. { "max14577-charger", MAXIM_DEVICE_TYPE_MAX14577, },
  512. { "max77836-charger", MAXIM_DEVICE_TYPE_MAX77836, },
  513. { }
  514. };
  515. MODULE_DEVICE_TABLE(platform, max14577_charger_id);
  516. static struct platform_driver max14577_charger_driver = {
  517. .driver = {
  518. .name = "max14577-charger",
  519. },
  520. .probe = max14577_charger_probe,
  521. .remove = max14577_charger_remove,
  522. .id_table = max14577_charger_id,
  523. };
  524. module_platform_driver(max14577_charger_driver);
  525. MODULE_AUTHOR("Krzysztof Kozlowski <k.kozlowski@samsung.com>");
  526. MODULE_DESCRIPTION("Maxim 14577/77836 charger driver");
  527. MODULE_LICENSE("GPL");