rk817_charger.c 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Charger Driver for Rockchip rk817
  4. *
  5. * Copyright (c) 2021 Maya Matuszczyk <[email protected]>
  6. *
  7. * Authors: Maya Matuszczyk <[email protected]>
  8. * Chris Morgan <[email protected]>
  9. */
  10. #include <asm/unaligned.h>
  11. #include <linux/devm-helpers.h>
  12. #include <linux/mfd/rk808.h>
  13. #include <linux/irq.h>
  14. #include <linux/of.h>
  15. #include <linux/platform_device.h>
  16. #include <linux/power_supply.h>
  17. #include <linux/regmap.h>
  18. /* Charging statuses reported by hardware register */
  19. enum rk817_charge_status {
  20. CHRG_OFF,
  21. DEAD_CHRG,
  22. TRICKLE_CHRG,
  23. CC_OR_CV_CHRG,
  24. CHARGE_FINISH,
  25. USB_OVER_VOL,
  26. BAT_TMP_ERR,
  27. BAT_TIM_ERR,
  28. };
  29. /*
  30. * Max charging current read to/written from hardware register.
  31. * Note how highest value corresponding to 0x7 is the lowest
  32. * current, this is per the datasheet.
  33. */
  34. enum rk817_chg_cur {
  35. CHG_1A,
  36. CHG_1_5A,
  37. CHG_2A,
  38. CHG_2_5A,
  39. CHG_2_75A,
  40. CHG_3A,
  41. CHG_3_5A,
  42. CHG_0_5A,
  43. };
  44. struct rk817_charger {
  45. struct device *dev;
  46. struct rk808 *rk808;
  47. struct power_supply *bat_ps;
  48. struct power_supply *chg_ps;
  49. bool plugged_in;
  50. bool battery_present;
  51. /*
  52. * voltage_k and voltage_b values are used to calibrate the ADC
  53. * voltage readings. While they are documented in the BSP kernel and
  54. * datasheet as voltage_k and voltage_b, there is no further
  55. * information explaining them in more detail.
  56. */
  57. uint32_t voltage_k;
  58. uint32_t voltage_b;
  59. /*
  60. * soc - state of charge - like the BSP this is stored as a percentage,
  61. * to the thousandth. BSP has a display state of charge (dsoc) and a
  62. * remaining state of charge (rsoc). This value will be used for both
  63. * purposes here so we don't do any fancy math to try and "smooth" the
  64. * charge and just report it as it is. Note for example an soc of 100
  65. * is stored as 100000, an soc of 50 is stored as 50000, etc.
  66. */
  67. int soc;
  68. /*
  69. * Capacity of battery when fully charged, equal or less than design
  70. * capacity depending upon wear. BSP kernel saves to nvram in mAh,
  71. * so this value is in mAh not the standard uAh.
  72. */
  73. int fcc_mah;
  74. /*
  75. * Calibrate the SOC on a fully charged battery, this way we can use
  76. * the calibrated SOC value to correct for columb counter drift.
  77. */
  78. bool soc_cal;
  79. /* Implementation specific immutable properties from device tree */
  80. int res_div;
  81. int sleep_enter_current_ua;
  82. int sleep_filter_current_ua;
  83. int bat_charge_full_design_uah;
  84. int bat_voltage_min_design_uv;
  85. int bat_voltage_max_design_uv;
  86. /* Values updated periodically by driver for display. */
  87. int charge_now_uah;
  88. int volt_avg_uv;
  89. int cur_avg_ua;
  90. int max_chg_cur_ua;
  91. int max_chg_volt_uv;
  92. int charge_status;
  93. int charger_input_volt_avg_uv;
  94. /* Work queue to periodically update values. */
  95. struct delayed_work work;
  96. };
  97. /* ADC coefficients extracted from BSP kernel */
  98. #define ADC_TO_CURRENT(adc_value, res_div) \
  99. (adc_value * 172 / res_div)
  100. #define CURRENT_TO_ADC(current, samp_res) \
  101. (current * samp_res / 172)
  102. #define CHARGE_TO_ADC(capacity, res_div) \
  103. (capacity * res_div * 3600 / 172 * 1000)
  104. #define ADC_TO_CHARGE_UAH(adc_value, res_div) \
  105. (adc_value / 3600 * 172 / res_div)
  106. static int rk817_chg_cur_to_reg(u32 chg_cur_ma)
  107. {
  108. if (chg_cur_ma >= 3500)
  109. return CHG_3_5A;
  110. else if (chg_cur_ma >= 3000)
  111. return CHG_3A;
  112. else if (chg_cur_ma >= 2750)
  113. return CHG_2_75A;
  114. else if (chg_cur_ma >= 2500)
  115. return CHG_2_5A;
  116. else if (chg_cur_ma >= 2000)
  117. return CHG_2A;
  118. else if (chg_cur_ma >= 1500)
  119. return CHG_1_5A;
  120. else if (chg_cur_ma >= 1000)
  121. return CHG_1A;
  122. else if (chg_cur_ma >= 500)
  123. return CHG_0_5A;
  124. else
  125. return -EINVAL;
  126. }
  127. static int rk817_chg_cur_from_reg(u8 reg)
  128. {
  129. switch (reg) {
  130. case CHG_0_5A:
  131. return 500000;
  132. case CHG_1A:
  133. return 1000000;
  134. case CHG_1_5A:
  135. return 1500000;
  136. case CHG_2A:
  137. return 2000000;
  138. case CHG_2_5A:
  139. return 2500000;
  140. case CHG_2_75A:
  141. return 2750000;
  142. case CHG_3A:
  143. return 3000000;
  144. case CHG_3_5A:
  145. return 3500000;
  146. default:
  147. return -EINVAL;
  148. }
  149. }
  150. static void rk817_bat_calib_vol(struct rk817_charger *charger)
  151. {
  152. uint32_t vcalib0 = 0;
  153. uint32_t vcalib1 = 0;
  154. u8 bulk_reg[2];
  155. /* calibrate voltage */
  156. regmap_bulk_read(charger->rk808->regmap, RK817_GAS_GAUGE_VCALIB0_H,
  157. bulk_reg, 2);
  158. vcalib0 = get_unaligned_be16(bulk_reg);
  159. regmap_bulk_read(charger->rk808->regmap, RK817_GAS_GAUGE_VCALIB1_H,
  160. bulk_reg, 2);
  161. vcalib1 = get_unaligned_be16(bulk_reg);
  162. /* values were taken from BSP kernel */
  163. charger->voltage_k = (4025 - 2300) * 1000 /
  164. ((vcalib1 - vcalib0) ? (vcalib1 - vcalib0) : 1);
  165. charger->voltage_b = 4025 - (charger->voltage_k * vcalib1) / 1000;
  166. }
  167. static void rk817_bat_calib_cur(struct rk817_charger *charger)
  168. {
  169. u8 bulk_reg[2];
  170. /* calibrate current */
  171. regmap_bulk_read(charger->rk808->regmap, RK817_GAS_GAUGE_IOFFSET_H,
  172. bulk_reg, 2);
  173. regmap_bulk_write(charger->rk808->regmap, RK817_GAS_GAUGE_CAL_OFFSET_H,
  174. bulk_reg, 2);
  175. }
  176. /*
  177. * note that only the fcc_mah is really used by this driver, the other values
  178. * are to ensure we can remain backwards compatible with the BSP kernel.
  179. */
  180. static int rk817_record_battery_nvram_values(struct rk817_charger *charger)
  181. {
  182. u8 bulk_reg[3];
  183. int ret, rsoc;
  184. /*
  185. * write the soc value to the nvram location used by the BSP kernel
  186. * for the dsoc value.
  187. */
  188. put_unaligned_le24(charger->soc, bulk_reg);
  189. ret = regmap_bulk_write(charger->rk808->regmap, RK817_GAS_GAUGE_BAT_R1,
  190. bulk_reg, 3);
  191. if (ret < 0)
  192. return ret;
  193. /*
  194. * write the remaining capacity in mah to the nvram location used by
  195. * the BSP kernel for the rsoc value.
  196. */
  197. rsoc = (charger->soc * charger->fcc_mah) / 100000;
  198. put_unaligned_le24(rsoc, bulk_reg);
  199. ret = regmap_bulk_write(charger->rk808->regmap, RK817_GAS_GAUGE_DATA0,
  200. bulk_reg, 3);
  201. if (ret < 0)
  202. return ret;
  203. /* write the fcc_mah in mAh, just as the BSP kernel does. */
  204. put_unaligned_le24(charger->fcc_mah, bulk_reg);
  205. ret = regmap_bulk_write(charger->rk808->regmap, RK817_GAS_GAUGE_DATA3,
  206. bulk_reg, 3);
  207. if (ret < 0)
  208. return ret;
  209. return 0;
  210. }
  211. static int rk817_bat_calib_cap(struct rk817_charger *charger)
  212. {
  213. struct rk808 *rk808 = charger->rk808;
  214. int tmp, charge_now, charge_now_adc, volt_avg;
  215. u8 bulk_reg[4];
  216. /* Calibrate the soc and fcc on a fully charged battery */
  217. if (charger->charge_status == CHARGE_FINISH && (!charger->soc_cal)) {
  218. /*
  219. * soc should be 100000 and columb counter should show the full
  220. * charge capacity. Note that if the device is unplugged for a
  221. * period of several days the columb counter will have a large
  222. * margin of error, so setting it back to the full charge on
  223. * a completed charge cycle should correct this (my device was
  224. * showing 33% battery after 3 days unplugged when it should
  225. * have been closer to 95% based on voltage and charge
  226. * current).
  227. */
  228. charger->soc = 100000;
  229. charge_now_adc = CHARGE_TO_ADC(charger->fcc_mah,
  230. charger->res_div);
  231. put_unaligned_be32(charge_now_adc, bulk_reg);
  232. regmap_bulk_write(rk808->regmap, RK817_GAS_GAUGE_Q_INIT_H3,
  233. bulk_reg, 4);
  234. charger->soc_cal = 1;
  235. dev_dbg(charger->dev,
  236. "Fully charged. SOC is %d, full capacity is %d\n",
  237. charger->soc, charger->fcc_mah * 1000);
  238. }
  239. /*
  240. * The columb counter can drift up slightly, so we should correct for
  241. * it. But don't correct it until we're at 100% soc.
  242. */
  243. if (charger->charge_status == CHARGE_FINISH && charger->soc_cal) {
  244. regmap_bulk_read(rk808->regmap, RK817_GAS_GAUGE_Q_PRES_H3,
  245. bulk_reg, 4);
  246. charge_now_adc = get_unaligned_be32(bulk_reg);
  247. if (charge_now_adc < 0)
  248. return charge_now_adc;
  249. charge_now = ADC_TO_CHARGE_UAH(charge_now_adc,
  250. charger->res_div);
  251. /*
  252. * Re-init columb counter with updated values to correct drift.
  253. */
  254. if (charge_now / 1000 > charger->fcc_mah) {
  255. dev_dbg(charger->dev,
  256. "Recalibrating columb counter to %d uah\n",
  257. charge_now);
  258. /*
  259. * Order of operations matters here to ensure we keep
  260. * enough precision until the last step to keep from
  261. * making needless updates to columb counter.
  262. */
  263. charge_now_adc = CHARGE_TO_ADC(charger->fcc_mah,
  264. charger->res_div);
  265. put_unaligned_be32(charge_now_adc, bulk_reg);
  266. regmap_bulk_write(rk808->regmap,
  267. RK817_GAS_GAUGE_Q_INIT_H3,
  268. bulk_reg, 4);
  269. }
  270. }
  271. /*
  272. * Calibrate the fully charged capacity when we previously had a full
  273. * battery (soc_cal = 1) and are now empty (at or below minimum design
  274. * voltage). If our columb counter is still positive, subtract that
  275. * from our fcc value to get a calibrated fcc, and if our columb
  276. * counter is negative add that to our fcc (but not to exceed our
  277. * design capacity).
  278. */
  279. regmap_bulk_read(charger->rk808->regmap, RK817_GAS_GAUGE_BAT_VOL_H,
  280. bulk_reg, 2);
  281. tmp = get_unaligned_be16(bulk_reg);
  282. volt_avg = (charger->voltage_k * tmp) + 1000 * charger->voltage_b;
  283. if (volt_avg <= charger->bat_voltage_min_design_uv &&
  284. charger->soc_cal) {
  285. regmap_bulk_read(rk808->regmap, RK817_GAS_GAUGE_Q_PRES_H3,
  286. bulk_reg, 4);
  287. charge_now_adc = get_unaligned_be32(bulk_reg);
  288. charge_now = ADC_TO_CHARGE_UAH(charge_now_adc,
  289. charger->res_div);
  290. /*
  291. * Note, if charge_now is negative this will add it (what we
  292. * want) and if it's positive this will subtract (also what
  293. * we want).
  294. */
  295. charger->fcc_mah = charger->fcc_mah - (charge_now / 1000);
  296. dev_dbg(charger->dev,
  297. "Recalibrating full charge capacity to %d uah\n",
  298. charger->fcc_mah * 1000);
  299. }
  300. /*
  301. * Set the SOC to 0 if we are below the minimum system voltage.
  302. */
  303. if (volt_avg <= charger->bat_voltage_min_design_uv) {
  304. charger->soc = 0;
  305. charge_now_adc = CHARGE_TO_ADC(0, charger->res_div);
  306. put_unaligned_be32(charge_now_adc, bulk_reg);
  307. regmap_bulk_write(rk808->regmap,
  308. RK817_GAS_GAUGE_Q_INIT_H3, bulk_reg, 4);
  309. dev_warn(charger->dev,
  310. "Battery voltage %d below minimum voltage %d\n",
  311. volt_avg, charger->bat_voltage_min_design_uv);
  312. }
  313. rk817_record_battery_nvram_values(charger);
  314. return 0;
  315. }
  316. static void rk817_read_props(struct rk817_charger *charger)
  317. {
  318. int tmp, reg;
  319. u8 bulk_reg[4];
  320. /*
  321. * Recalibrate voltage and current readings if we need to BSP does both
  322. * on CUR_CALIB_UPD, ignoring VOL_CALIB_UPD. Curiously enough, both
  323. * documentation and the BSP show that you perform an update if bit 7
  324. * is 1, but you clear the status by writing a 1 to bit 7.
  325. */
  326. regmap_read(charger->rk808->regmap, RK817_GAS_GAUGE_ADC_CONFIG1, &reg);
  327. if (reg & RK817_VOL_CUR_CALIB_UPD) {
  328. rk817_bat_calib_cur(charger);
  329. rk817_bat_calib_vol(charger);
  330. regmap_write_bits(charger->rk808->regmap,
  331. RK817_GAS_GAUGE_ADC_CONFIG1,
  332. RK817_VOL_CUR_CALIB_UPD,
  333. RK817_VOL_CUR_CALIB_UPD);
  334. }
  335. /* Update reported charge. */
  336. regmap_bulk_read(charger->rk808->regmap, RK817_GAS_GAUGE_Q_PRES_H3,
  337. bulk_reg, 4);
  338. tmp = get_unaligned_be32(bulk_reg);
  339. charger->charge_now_uah = ADC_TO_CHARGE_UAH(tmp, charger->res_div);
  340. if (charger->charge_now_uah < 0)
  341. charger->charge_now_uah = 0;
  342. if (charger->charge_now_uah > charger->fcc_mah * 1000)
  343. charger->charge_now_uah = charger->fcc_mah * 1000;
  344. /* Update soc based on reported charge. */
  345. charger->soc = charger->charge_now_uah * 100 / charger->fcc_mah;
  346. /* Update reported voltage. */
  347. regmap_bulk_read(charger->rk808->regmap, RK817_GAS_GAUGE_BAT_VOL_H,
  348. bulk_reg, 2);
  349. tmp = get_unaligned_be16(bulk_reg);
  350. charger->volt_avg_uv = (charger->voltage_k * tmp) + 1000 *
  351. charger->voltage_b;
  352. /*
  353. * Update reported current. Note value from registers is a signed 16
  354. * bit int.
  355. */
  356. regmap_bulk_read(charger->rk808->regmap, RK817_GAS_GAUGE_BAT_CUR_H,
  357. bulk_reg, 2);
  358. tmp = (short int)get_unaligned_be16(bulk_reg);
  359. charger->cur_avg_ua = ADC_TO_CURRENT(tmp, charger->res_div);
  360. /*
  361. * Update the max charge current. This value shouldn't change, but we
  362. * can read it to report what the PMIC says it is instead of simply
  363. * returning the default value.
  364. */
  365. regmap_read(charger->rk808->regmap, RK817_PMIC_CHRG_OUT, &reg);
  366. charger->max_chg_cur_ua =
  367. rk817_chg_cur_from_reg(reg & RK817_CHRG_CUR_SEL);
  368. /*
  369. * Update max charge voltage. Like the max charge current this value
  370. * shouldn't change, but we can report what the PMIC says.
  371. */
  372. regmap_read(charger->rk808->regmap, RK817_PMIC_CHRG_OUT, &reg);
  373. charger->max_chg_volt_uv = ((((reg & RK817_CHRG_VOL_SEL) >> 4) *
  374. 50000) + 4100000);
  375. /* Check if battery still present. */
  376. regmap_read(charger->rk808->regmap, RK817_PMIC_CHRG_STS, &reg);
  377. charger->battery_present = (reg & RK817_BAT_EXS);
  378. /* Get which type of charge we are using (if any). */
  379. regmap_read(charger->rk808->regmap, RK817_PMIC_CHRG_STS, &reg);
  380. charger->charge_status = (reg >> 4) & 0x07;
  381. /*
  382. * Get charger input voltage. Note that on my example hardware (an
  383. * Odroid Go Advance) the voltage of the power connector is measured
  384. * on the register labelled USB in the datasheet; I don't know if this
  385. * is how it is designed or just a quirk of the implementation. I
  386. * believe this will also measure the voltage of the USB output when in
  387. * OTG mode, if that is the case we may need to change this in the
  388. * future to return 0 if the power supply status is offline (I can't
  389. * test this with my current implementation. Also, when the voltage
  390. * should be zero sometimes the ADC still shows a single bit (which
  391. * would register as 20000uv). When this happens set it to 0.
  392. */
  393. regmap_bulk_read(charger->rk808->regmap, RK817_GAS_GAUGE_USB_VOL_H,
  394. bulk_reg, 2);
  395. reg = get_unaligned_be16(bulk_reg);
  396. if (reg > 1) {
  397. tmp = ((charger->voltage_k * reg / 1000 + charger->voltage_b) *
  398. 60 / 46);
  399. charger->charger_input_volt_avg_uv = tmp * 1000;
  400. } else {
  401. charger->charger_input_volt_avg_uv = 0;
  402. }
  403. /* Calibrate battery capacity and soc. */
  404. rk817_bat_calib_cap(charger);
  405. }
  406. static int rk817_bat_get_prop(struct power_supply *ps,
  407. enum power_supply_property prop,
  408. union power_supply_propval *val)
  409. {
  410. struct rk817_charger *charger = power_supply_get_drvdata(ps);
  411. switch (prop) {
  412. case POWER_SUPPLY_PROP_PRESENT:
  413. val->intval = charger->battery_present;
  414. break;
  415. case POWER_SUPPLY_PROP_STATUS:
  416. if (charger->cur_avg_ua < 0) {
  417. val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
  418. break;
  419. }
  420. switch (charger->charge_status) {
  421. case CHRG_OFF:
  422. val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
  423. break;
  424. /*
  425. * Dead charge is documented, but not explained. I never
  426. * observed it but assume it's a pre-charge for a dead
  427. * battery.
  428. */
  429. case DEAD_CHRG:
  430. case TRICKLE_CHRG:
  431. case CC_OR_CV_CHRG:
  432. val->intval = POWER_SUPPLY_STATUS_CHARGING;
  433. break;
  434. case CHARGE_FINISH:
  435. val->intval = POWER_SUPPLY_STATUS_FULL;
  436. break;
  437. default:
  438. val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
  439. return -EINVAL;
  440. }
  441. break;
  442. case POWER_SUPPLY_PROP_CHARGE_TYPE:
  443. switch (charger->charge_status) {
  444. case CHRG_OFF:
  445. case CHARGE_FINISH:
  446. val->intval = POWER_SUPPLY_CHARGE_TYPE_NONE;
  447. break;
  448. case TRICKLE_CHRG:
  449. val->intval = POWER_SUPPLY_CHARGE_TYPE_TRICKLE;
  450. break;
  451. case DEAD_CHRG:
  452. case CC_OR_CV_CHRG:
  453. val->intval = POWER_SUPPLY_CHARGE_TYPE_STANDARD;
  454. break;
  455. default:
  456. val->intval = POWER_SUPPLY_CHARGE_TYPE_UNKNOWN;
  457. break;
  458. }
  459. break;
  460. case POWER_SUPPLY_PROP_CHARGE_FULL:
  461. val->intval = charger->fcc_mah * 1000;
  462. break;
  463. case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
  464. val->intval = charger->bat_charge_full_design_uah;
  465. break;
  466. case POWER_SUPPLY_PROP_CHARGE_EMPTY_DESIGN:
  467. val->intval = 0;
  468. break;
  469. case POWER_SUPPLY_PROP_CHARGE_NOW:
  470. val->intval = charger->charge_now_uah;
  471. break;
  472. case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
  473. val->intval = charger->bat_voltage_min_design_uv;
  474. break;
  475. case POWER_SUPPLY_PROP_CAPACITY:
  476. /* Add 500 so that values like 99999 are 100% not 99%. */
  477. val->intval = (charger->soc + 500) / 1000;
  478. if (val->intval > 100)
  479. val->intval = 100;
  480. if (val->intval < 0)
  481. val->intval = 0;
  482. break;
  483. case POWER_SUPPLY_PROP_VOLTAGE_AVG:
  484. val->intval = charger->volt_avg_uv;
  485. break;
  486. case POWER_SUPPLY_PROP_CURRENT_AVG:
  487. val->intval = charger->cur_avg_ua;
  488. break;
  489. case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX:
  490. val->intval = charger->max_chg_cur_ua;
  491. break;
  492. case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX:
  493. val->intval = charger->max_chg_volt_uv;
  494. break;
  495. case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN:
  496. val->intval = charger->bat_voltage_max_design_uv;
  497. break;
  498. default:
  499. return -EINVAL;
  500. }
  501. return 0;
  502. }
  503. static int rk817_chg_get_prop(struct power_supply *ps,
  504. enum power_supply_property prop,
  505. union power_supply_propval *val)
  506. {
  507. struct rk817_charger *charger = power_supply_get_drvdata(ps);
  508. switch (prop) {
  509. case POWER_SUPPLY_PROP_ONLINE:
  510. val->intval = charger->plugged_in;
  511. break;
  512. case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN:
  513. /* max voltage from datasheet at 5.5v (default 5.0v) */
  514. val->intval = 5500000;
  515. break;
  516. case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
  517. /* min voltage from datasheet at 3.8v (default 5.0v) */
  518. val->intval = 3800000;
  519. break;
  520. case POWER_SUPPLY_PROP_VOLTAGE_AVG:
  521. val->intval = charger->charger_input_volt_avg_uv;
  522. break;
  523. /*
  524. * While it's possible that other implementations could use different
  525. * USB types, the current implementation for this PMIC (the Odroid Go
  526. * Advance) only uses a dedicated charging port with no rx/tx lines.
  527. */
  528. case POWER_SUPPLY_PROP_USB_TYPE:
  529. val->intval = POWER_SUPPLY_USB_TYPE_DCP;
  530. break;
  531. default:
  532. return -EINVAL;
  533. }
  534. return 0;
  535. }
  536. static irqreturn_t rk817_plug_in_isr(int irq, void *cg)
  537. {
  538. struct rk817_charger *charger;
  539. charger = (struct rk817_charger *)cg;
  540. charger->plugged_in = 1;
  541. power_supply_changed(charger->chg_ps);
  542. power_supply_changed(charger->bat_ps);
  543. /* try to recalibrate capacity if we hit full charge. */
  544. charger->soc_cal = 0;
  545. rk817_read_props(charger);
  546. dev_dbg(charger->dev, "Power Cord Inserted\n");
  547. return IRQ_HANDLED;
  548. }
  549. static irqreturn_t rk817_plug_out_isr(int irq, void *cg)
  550. {
  551. struct rk817_charger *charger;
  552. struct rk808 *rk808;
  553. charger = (struct rk817_charger *)cg;
  554. rk808 = charger->rk808;
  555. charger->plugged_in = 0;
  556. power_supply_changed(charger->bat_ps);
  557. power_supply_changed(charger->chg_ps);
  558. /*
  559. * For some reason the bits of RK817_PMIC_CHRG_IN reset whenever the
  560. * power cord is unplugged. This was not documented in the BSP kernel
  561. * or the datasheet and only discovered by trial and error. Set minimum
  562. * USB input voltage to 4.5v and enable USB voltage input limit.
  563. */
  564. regmap_write_bits(rk808->regmap, RK817_PMIC_CHRG_IN,
  565. RK817_USB_VLIM_SEL, (0x05 << 4));
  566. regmap_write_bits(rk808->regmap, RK817_PMIC_CHRG_IN, RK817_USB_VLIM_EN,
  567. (0x01 << 7));
  568. /*
  569. * Set average USB input current limit to 1.5A and enable USB current
  570. * input limit.
  571. */
  572. regmap_write_bits(rk808->regmap, RK817_PMIC_CHRG_IN,
  573. RK817_USB_ILIM_SEL, 0x03);
  574. regmap_write_bits(rk808->regmap, RK817_PMIC_CHRG_IN, RK817_USB_ILIM_EN,
  575. (0x01 << 3));
  576. rk817_read_props(charger);
  577. dev_dbg(charger->dev, "Power Cord Removed\n");
  578. return IRQ_HANDLED;
  579. }
  580. static enum power_supply_property rk817_bat_props[] = {
  581. POWER_SUPPLY_PROP_PRESENT,
  582. POWER_SUPPLY_PROP_STATUS,
  583. POWER_SUPPLY_PROP_CHARGE_TYPE,
  584. POWER_SUPPLY_PROP_CHARGE_FULL,
  585. POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
  586. POWER_SUPPLY_PROP_CHARGE_EMPTY_DESIGN,
  587. POWER_SUPPLY_PROP_CHARGE_NOW,
  588. POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX,
  589. POWER_SUPPLY_PROP_VOLTAGE_AVG,
  590. POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX,
  591. POWER_SUPPLY_PROP_CURRENT_AVG,
  592. POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
  593. POWER_SUPPLY_PROP_CAPACITY,
  594. POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN,
  595. };
  596. static enum power_supply_property rk817_chg_props[] = {
  597. POWER_SUPPLY_PROP_ONLINE,
  598. POWER_SUPPLY_PROP_USB_TYPE,
  599. POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN,
  600. POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
  601. POWER_SUPPLY_PROP_VOLTAGE_AVG,
  602. };
  603. static enum power_supply_usb_type rk817_usb_type[] = {
  604. POWER_SUPPLY_USB_TYPE_DCP,
  605. POWER_SUPPLY_USB_TYPE_UNKNOWN,
  606. };
  607. static const struct power_supply_desc rk817_bat_desc = {
  608. .name = "rk817-battery",
  609. .type = POWER_SUPPLY_TYPE_BATTERY,
  610. .properties = rk817_bat_props,
  611. .num_properties = ARRAY_SIZE(rk817_bat_props),
  612. .get_property = rk817_bat_get_prop,
  613. };
  614. static const struct power_supply_desc rk817_chg_desc = {
  615. .name = "rk817-charger",
  616. .type = POWER_SUPPLY_TYPE_USB,
  617. .usb_types = rk817_usb_type,
  618. .num_usb_types = ARRAY_SIZE(rk817_usb_type),
  619. .properties = rk817_chg_props,
  620. .num_properties = ARRAY_SIZE(rk817_chg_props),
  621. .get_property = rk817_chg_get_prop,
  622. };
  623. static int rk817_read_battery_nvram_values(struct rk817_charger *charger)
  624. {
  625. u8 bulk_reg[3];
  626. int ret;
  627. /* Read the nvram data for full charge capacity. */
  628. ret = regmap_bulk_read(charger->rk808->regmap,
  629. RK817_GAS_GAUGE_DATA3, bulk_reg, 3);
  630. if (ret < 0)
  631. return ret;
  632. charger->fcc_mah = get_unaligned_le24(bulk_reg);
  633. /*
  634. * Sanity checking for values equal to zero or less than would be
  635. * practical for this device (BSP Kernel assumes 500mAH or less) for
  636. * practicality purposes. Also check if the value is too large and
  637. * correct it.
  638. */
  639. if ((charger->fcc_mah < 500) ||
  640. ((charger->fcc_mah * 1000) > charger->bat_charge_full_design_uah)) {
  641. dev_info(charger->dev,
  642. "Invalid NVRAM max charge, setting to %u uAH\n",
  643. charger->bat_charge_full_design_uah);
  644. charger->fcc_mah = charger->bat_charge_full_design_uah / 1000;
  645. }
  646. /*
  647. * Read the nvram for state of charge. Sanity check for values greater
  648. * than 100 (10000) or less than 0, because other things (BSP kernels,
  649. * U-Boot, or even i2cset) can write to this register. If the value is
  650. * off it should get corrected automatically when the voltage drops to
  651. * the min (soc is 0) or when the battery is full (soc is 100).
  652. */
  653. ret = regmap_bulk_read(charger->rk808->regmap,
  654. RK817_GAS_GAUGE_BAT_R1, bulk_reg, 3);
  655. if (ret < 0)
  656. return ret;
  657. charger->soc = get_unaligned_le24(bulk_reg);
  658. if (charger->soc > 10000)
  659. charger->soc = 10000;
  660. if (charger->soc < 0)
  661. charger->soc = 0;
  662. return 0;
  663. }
  664. static int
  665. rk817_read_or_set_full_charge_on_boot(struct rk817_charger *charger,
  666. struct power_supply_battery_info *bat_info)
  667. {
  668. struct rk808 *rk808 = charger->rk808;
  669. u8 bulk_reg[4];
  670. u32 boot_voltage, boot_charge_mah;
  671. int ret, reg, off_time, tmp;
  672. bool first_boot;
  673. /*
  674. * Check if the battery is uninitalized. If it is, the columb counter
  675. * needs to be set up.
  676. */
  677. ret = regmap_read(rk808->regmap, RK817_GAS_GAUGE_GG_STS, &reg);
  678. if (ret < 0)
  679. return ret;
  680. first_boot = reg & RK817_BAT_CON;
  681. /*
  682. * If the battery is uninitialized, use the poweron voltage and an ocv
  683. * lookup to guess our charge. The number won't be very accurate until
  684. * we hit either our minimum voltage (0%) or full charge (100%).
  685. */
  686. if (first_boot) {
  687. regmap_bulk_read(rk808->regmap, RK817_GAS_GAUGE_PWRON_VOL_H,
  688. bulk_reg, 2);
  689. tmp = get_unaligned_be16(bulk_reg);
  690. boot_voltage = (charger->voltage_k * tmp) +
  691. 1000 * charger->voltage_b;
  692. /*
  693. * Since only implementation has no working thermistor, assume
  694. * 20C for OCV lookup. If lookup fails, report error with OCV
  695. * table.
  696. */
  697. charger->soc = power_supply_batinfo_ocv2cap(bat_info,
  698. boot_voltage,
  699. 20) * 1000;
  700. if (charger->soc < 0)
  701. charger->soc = 0;
  702. /* Guess that full charge capacity is the design capacity */
  703. charger->fcc_mah = charger->bat_charge_full_design_uah / 1000;
  704. /*
  705. * Set battery as "set up". BSP driver uses this value even
  706. * though datasheet claims it's a read-only value.
  707. */
  708. regmap_write_bits(rk808->regmap, RK817_GAS_GAUGE_GG_STS,
  709. RK817_BAT_CON, 0);
  710. /* Save nvram values */
  711. ret = rk817_record_battery_nvram_values(charger);
  712. if (ret < 0)
  713. return ret;
  714. } else {
  715. ret = rk817_read_battery_nvram_values(charger);
  716. if (ret < 0)
  717. return ret;
  718. regmap_bulk_read(rk808->regmap, RK817_GAS_GAUGE_Q_PRES_H3,
  719. bulk_reg, 4);
  720. tmp = get_unaligned_be32(bulk_reg);
  721. if (tmp < 0)
  722. tmp = 0;
  723. boot_charge_mah = ADC_TO_CHARGE_UAH(tmp,
  724. charger->res_div) / 1000;
  725. /*
  726. * Check if the columb counter has been off for more than 30
  727. * minutes as it tends to drift downward. If so, re-init soc
  728. * with the boot voltage instead. Note the unit values for the
  729. * OFF_CNT register appear to be in decaminutes and stops
  730. * counting at 2550 (0xFF) minutes. BSP kernel used OCV, but
  731. * for me occasionally that would show invalid values. Boot
  732. * voltage is only accurate for me on first poweron (not
  733. * reboots), but we shouldn't ever encounter an OFF_CNT more
  734. * than 0 on a reboot anyway.
  735. */
  736. regmap_read(rk808->regmap, RK817_GAS_GAUGE_OFF_CNT, &off_time);
  737. if (off_time >= 3) {
  738. regmap_bulk_read(rk808->regmap,
  739. RK817_GAS_GAUGE_PWRON_VOL_H,
  740. bulk_reg, 2);
  741. tmp = get_unaligned_be16(bulk_reg);
  742. boot_voltage = (charger->voltage_k * tmp) +
  743. 1000 * charger->voltage_b;
  744. charger->soc =
  745. power_supply_batinfo_ocv2cap(bat_info,
  746. boot_voltage,
  747. 20) * 1000;
  748. } else {
  749. charger->soc = (boot_charge_mah * 1000 * 100 /
  750. charger->fcc_mah);
  751. }
  752. }
  753. regmap_bulk_read(rk808->regmap, RK817_GAS_GAUGE_PWRON_VOL_H,
  754. bulk_reg, 2);
  755. tmp = get_unaligned_be16(bulk_reg);
  756. boot_voltage = (charger->voltage_k * tmp) + 1000 * charger->voltage_b;
  757. regmap_bulk_read(rk808->regmap, RK817_GAS_GAUGE_Q_PRES_H3,
  758. bulk_reg, 4);
  759. tmp = get_unaligned_be32(bulk_reg);
  760. boot_charge_mah = ADC_TO_CHARGE_UAH(tmp, charger->res_div) / 1000;
  761. regmap_bulk_read(rk808->regmap, RK817_GAS_GAUGE_OCV_VOL_H,
  762. bulk_reg, 2);
  763. tmp = get_unaligned_be16(bulk_reg);
  764. boot_voltage = (charger->voltage_k * tmp) + 1000 * charger->voltage_b;
  765. /*
  766. * Now we have our full charge capacity and soc, init the columb
  767. * counter.
  768. */
  769. boot_charge_mah = charger->soc * charger->fcc_mah / 100 / 1000;
  770. if (boot_charge_mah > charger->fcc_mah)
  771. boot_charge_mah = charger->fcc_mah;
  772. tmp = CHARGE_TO_ADC(boot_charge_mah, charger->res_div);
  773. put_unaligned_be32(tmp, bulk_reg);
  774. ret = regmap_bulk_write(rk808->regmap, RK817_GAS_GAUGE_Q_INIT_H3,
  775. bulk_reg, 4);
  776. if (ret < 0)
  777. return ret;
  778. /* Set QMAX value to max design capacity. */
  779. tmp = CHARGE_TO_ADC((charger->bat_charge_full_design_uah / 1000),
  780. charger->res_div);
  781. put_unaligned_be32(tmp, bulk_reg);
  782. ret = regmap_bulk_write(rk808->regmap, RK817_GAS_GAUGE_Q_MAX_H3,
  783. bulk_reg, 4);
  784. if (ret < 0)
  785. return ret;
  786. return 0;
  787. }
  788. static int rk817_battery_init(struct rk817_charger *charger,
  789. struct power_supply_battery_info *bat_info)
  790. {
  791. struct rk808 *rk808 = charger->rk808;
  792. u32 tmp, max_chg_vol_mv, max_chg_cur_ma;
  793. u8 max_chg_vol_reg, chg_term_i_reg;
  794. int ret, chg_term_ma, max_chg_cur_reg;
  795. u8 bulk_reg[2];
  796. /* Get initial plug state */
  797. regmap_read(rk808->regmap, RK817_SYS_STS, &tmp);
  798. charger->plugged_in = (tmp & RK817_PLUG_IN_STS);
  799. /*
  800. * Turn on all ADC functions to measure battery, USB, and sys voltage,
  801. * as well as batt temp. Note only tested implementation so far does
  802. * not use a battery with a thermistor.
  803. */
  804. regmap_write(rk808->regmap, RK817_GAS_GAUGE_ADC_CONFIG0, 0xfc);
  805. /*
  806. * Set relax mode voltage sampling interval and ADC offset calibration
  807. * interval to 8 minutes to mirror BSP kernel. Set voltage and current
  808. * modes to average to mirror BSP kernel.
  809. */
  810. regmap_write(rk808->regmap, RK817_GAS_GAUGE_GG_CON, 0x04);
  811. /* Calibrate voltage like the BSP does here. */
  812. rk817_bat_calib_vol(charger);
  813. /* Write relax threshold, derived from sleep enter current. */
  814. tmp = CURRENT_TO_ADC(charger->sleep_enter_current_ua,
  815. charger->res_div);
  816. put_unaligned_be16(tmp, bulk_reg);
  817. regmap_bulk_write(rk808->regmap, RK817_GAS_GAUGE_RELAX_THRE_H,
  818. bulk_reg, 2);
  819. /* Write sleep sample current, derived from sleep filter current. */
  820. tmp = CURRENT_TO_ADC(charger->sleep_filter_current_ua,
  821. charger->res_div);
  822. put_unaligned_be16(tmp, bulk_reg);
  823. regmap_bulk_write(rk808->regmap, RK817_GAS_GAUGE_SLEEP_CON_SAMP_CUR_H,
  824. bulk_reg, 2);
  825. /* Restart battery relax voltage */
  826. regmap_write_bits(rk808->regmap, RK817_GAS_GAUGE_GG_STS,
  827. RK817_RELAX_VOL_UPD, (0x0 << 2));
  828. /*
  829. * Set OCV Threshold Voltage to 127.5mV. This was hard coded like this
  830. * in the BSP.
  831. */
  832. regmap_write(rk808->regmap, RK817_GAS_GAUGE_OCV_THRE_VOL, 0xff);
  833. /*
  834. * Set maximum charging voltage to battery max voltage. Trying to be
  835. * incredibly safe with these value, as setting them wrong could
  836. * overcharge the battery, which would be very bad.
  837. */
  838. max_chg_vol_mv = bat_info->constant_charge_voltage_max_uv / 1000;
  839. max_chg_cur_ma = bat_info->constant_charge_current_max_ua / 1000;
  840. if (max_chg_vol_mv < 4100) {
  841. return dev_err_probe(charger->dev, -EINVAL,
  842. "invalid max charger voltage, value %u unsupported\n",
  843. max_chg_vol_mv * 1000);
  844. }
  845. if (max_chg_vol_mv > 4450) {
  846. dev_info(charger->dev,
  847. "Setting max charge voltage to 4450000uv\n");
  848. max_chg_vol_mv = 4450;
  849. }
  850. if (max_chg_cur_ma < 500) {
  851. return dev_err_probe(charger->dev, -EINVAL,
  852. "invalid max charger current, value %u unsupported\n",
  853. max_chg_cur_ma * 1000);
  854. }
  855. if (max_chg_cur_ma > 3500)
  856. dev_info(charger->dev,
  857. "Setting max charge current to 3500000ua\n");
  858. /*
  859. * Now that the values are sanity checked, if we subtract 4100 from the
  860. * max voltage and divide by 50, we conviently get the exact value for
  861. * the registers, which are 4.1v, 4.15v, 4.2v, 4.25v, 4.3v, 4.35v,
  862. * 4.4v, and 4.45v; these correspond to values 0x00 through 0x07.
  863. */
  864. max_chg_vol_reg = (max_chg_vol_mv - 4100) / 50;
  865. max_chg_cur_reg = rk817_chg_cur_to_reg(max_chg_cur_ma);
  866. if (max_chg_vol_reg < 0 || max_chg_vol_reg > 7) {
  867. return dev_err_probe(charger->dev, -EINVAL,
  868. "invalid max charger voltage, value %u unsupported\n",
  869. max_chg_vol_mv * 1000);
  870. }
  871. if (max_chg_cur_reg < 0 || max_chg_cur_reg > 7) {
  872. return dev_err_probe(charger->dev, -EINVAL,
  873. "invalid max charger current, value %u unsupported\n",
  874. max_chg_cur_ma * 1000);
  875. }
  876. /*
  877. * Write the values to the registers, and deliver an emergency warning
  878. * in the event they are not written correctly.
  879. */
  880. ret = regmap_write_bits(rk808->regmap, RK817_PMIC_CHRG_OUT,
  881. RK817_CHRG_VOL_SEL, (max_chg_vol_reg << 4));
  882. if (ret) {
  883. dev_emerg(charger->dev,
  884. "Danger, unable to set max charger voltage: %u\n",
  885. ret);
  886. }
  887. ret = regmap_write_bits(rk808->regmap, RK817_PMIC_CHRG_OUT,
  888. RK817_CHRG_CUR_SEL, max_chg_cur_reg);
  889. if (ret) {
  890. dev_emerg(charger->dev,
  891. "Danger, unable to set max charger current: %u\n",
  892. ret);
  893. }
  894. /* Set charge finishing mode to analog */
  895. regmap_write_bits(rk808->regmap, RK817_PMIC_CHRG_TERM,
  896. RK817_CHRG_TERM_ANA_DIG, (0x0 << 2));
  897. /*
  898. * Set charge finish current, warn if value not in range and keep
  899. * default.
  900. */
  901. chg_term_ma = bat_info->charge_term_current_ua / 1000;
  902. if (chg_term_ma < 150 || chg_term_ma > 400) {
  903. dev_warn(charger->dev,
  904. "Invalid charge termination %u, keeping default\n",
  905. chg_term_ma * 1000);
  906. chg_term_ma = 200;
  907. }
  908. /*
  909. * Values of 150ma, 200ma, 300ma, and 400ma correspond to 00, 01, 10,
  910. * and 11.
  911. */
  912. chg_term_i_reg = (chg_term_ma - 100) / 100;
  913. regmap_write_bits(rk808->regmap, RK817_PMIC_CHRG_TERM,
  914. RK817_CHRG_TERM_ANA_SEL, chg_term_i_reg);
  915. ret = rk817_read_or_set_full_charge_on_boot(charger, bat_info);
  916. if (ret < 0)
  917. return ret;
  918. /*
  919. * Set minimum USB input voltage to 4.5v and enable USB voltage input
  920. * limit.
  921. */
  922. regmap_write_bits(rk808->regmap, RK817_PMIC_CHRG_IN,
  923. RK817_USB_VLIM_SEL, (0x05 << 4));
  924. regmap_write_bits(rk808->regmap, RK817_PMIC_CHRG_IN, RK817_USB_VLIM_EN,
  925. (0x01 << 7));
  926. /*
  927. * Set average USB input current limit to 1.5A and enable USB current
  928. * input limit.
  929. */
  930. regmap_write_bits(rk808->regmap, RK817_PMIC_CHRG_IN,
  931. RK817_USB_ILIM_SEL, 0x03);
  932. regmap_write_bits(rk808->regmap, RK817_PMIC_CHRG_IN, RK817_USB_ILIM_EN,
  933. (0x01 << 3));
  934. return 0;
  935. }
  936. static void rk817_charging_monitor(struct work_struct *work)
  937. {
  938. struct rk817_charger *charger;
  939. charger = container_of(work, struct rk817_charger, work.work);
  940. rk817_read_props(charger);
  941. /* Run every 8 seconds like the BSP driver did. */
  942. queue_delayed_work(system_wq, &charger->work, msecs_to_jiffies(8000));
  943. }
  944. static void rk817_cleanup_node(void *data)
  945. {
  946. struct device_node *node = data;
  947. of_node_put(node);
  948. }
  949. static int rk817_charger_probe(struct platform_device *pdev)
  950. {
  951. struct rk808 *rk808 = dev_get_drvdata(pdev->dev.parent);
  952. struct rk817_charger *charger;
  953. struct device_node *node;
  954. struct power_supply_battery_info *bat_info;
  955. struct device *dev = &pdev->dev;
  956. struct power_supply_config pscfg = {};
  957. int plugin_irq, plugout_irq;
  958. int of_value;
  959. int ret;
  960. node = of_get_child_by_name(dev->parent->of_node, "charger");
  961. if (!node)
  962. return -ENODEV;
  963. ret = devm_add_action_or_reset(&pdev->dev, rk817_cleanup_node, node);
  964. if (ret)
  965. return ret;
  966. charger = devm_kzalloc(&pdev->dev, sizeof(*charger), GFP_KERNEL);
  967. if (!charger)
  968. return -ENOMEM;
  969. charger->rk808 = rk808;
  970. charger->dev = &pdev->dev;
  971. platform_set_drvdata(pdev, charger);
  972. rk817_bat_calib_vol(charger);
  973. pscfg.drv_data = charger;
  974. pscfg.of_node = node;
  975. /*
  976. * Get sample resistor value. Note only values of 10000 or 20000
  977. * microohms are allowed. Schematic for my test implementation (an
  978. * Odroid Go Advance) shows a 10 milliohm resistor for reference.
  979. */
  980. ret = of_property_read_u32(node, "rockchip,resistor-sense-micro-ohms",
  981. &of_value);
  982. if (ret < 0) {
  983. return dev_err_probe(dev, ret,
  984. "Error reading sample resistor value\n");
  985. }
  986. /*
  987. * Store as a 1 or a 2, since all we really use the value for is as a
  988. * divisor in some calculations.
  989. */
  990. charger->res_div = (of_value == 20000) ? 2 : 1;
  991. /*
  992. * Get sleep enter current value. Not sure what this value is for
  993. * other than to help calibrate the relax threshold.
  994. */
  995. ret = of_property_read_u32(node,
  996. "rockchip,sleep-enter-current-microamp",
  997. &of_value);
  998. if (ret < 0) {
  999. return dev_err_probe(dev, ret,
  1000. "Error reading sleep enter cur value\n");
  1001. }
  1002. charger->sleep_enter_current_ua = of_value;
  1003. /* Get sleep filter current value */
  1004. ret = of_property_read_u32(node,
  1005. "rockchip,sleep-filter-current-microamp",
  1006. &of_value);
  1007. if (ret < 0) {
  1008. return dev_err_probe(dev, ret,
  1009. "Error reading sleep filter cur value\n");
  1010. }
  1011. charger->sleep_filter_current_ua = of_value;
  1012. charger->bat_ps = devm_power_supply_register(&pdev->dev,
  1013. &rk817_bat_desc, &pscfg);
  1014. if (IS_ERR(charger->bat_ps))
  1015. return dev_err_probe(dev, -EINVAL,
  1016. "Battery failed to probe\n");
  1017. charger->chg_ps = devm_power_supply_register(&pdev->dev,
  1018. &rk817_chg_desc, &pscfg);
  1019. if (IS_ERR(charger->chg_ps))
  1020. return dev_err_probe(dev, -EINVAL,
  1021. "Charger failed to probe\n");
  1022. ret = power_supply_get_battery_info(charger->bat_ps,
  1023. &bat_info);
  1024. if (ret) {
  1025. return dev_err_probe(dev, ret,
  1026. "Unable to get battery info: %d\n", ret);
  1027. }
  1028. if ((bat_info->charge_full_design_uah <= 0) ||
  1029. (bat_info->voltage_min_design_uv <= 0) ||
  1030. (bat_info->voltage_max_design_uv <= 0) ||
  1031. (bat_info->constant_charge_voltage_max_uv <= 0) ||
  1032. (bat_info->constant_charge_current_max_ua <= 0) ||
  1033. (bat_info->charge_term_current_ua <= 0)) {
  1034. return dev_err_probe(dev, -EINVAL,
  1035. "Required bat info missing or invalid\n");
  1036. }
  1037. charger->bat_charge_full_design_uah = bat_info->charge_full_design_uah;
  1038. charger->bat_voltage_min_design_uv = bat_info->voltage_min_design_uv;
  1039. charger->bat_voltage_max_design_uv = bat_info->voltage_max_design_uv;
  1040. /*
  1041. * Has to run after power_supply_get_battery_info as it depends on some
  1042. * values discovered from that routine.
  1043. */
  1044. ret = rk817_battery_init(charger, bat_info);
  1045. if (ret)
  1046. return ret;
  1047. power_supply_put_battery_info(charger->bat_ps, bat_info);
  1048. plugin_irq = platform_get_irq(pdev, 0);
  1049. if (plugin_irq < 0)
  1050. return plugin_irq;
  1051. plugout_irq = platform_get_irq(pdev, 1);
  1052. if (plugout_irq < 0)
  1053. return plugout_irq;
  1054. ret = devm_request_threaded_irq(charger->dev, plugin_irq, NULL,
  1055. rk817_plug_in_isr,
  1056. IRQF_TRIGGER_RISING | IRQF_ONESHOT,
  1057. "rk817_plug_in", charger);
  1058. if (ret) {
  1059. return dev_err_probe(&pdev->dev, ret,
  1060. "plug_in_irq request failed!\n");
  1061. }
  1062. ret = devm_request_threaded_irq(charger->dev, plugout_irq, NULL,
  1063. rk817_plug_out_isr,
  1064. IRQF_TRIGGER_RISING | IRQF_ONESHOT,
  1065. "rk817_plug_out", charger);
  1066. if (ret) {
  1067. return dev_err_probe(&pdev->dev, ret,
  1068. "plug_out_irq request failed!\n");
  1069. }
  1070. ret = devm_delayed_work_autocancel(&pdev->dev, &charger->work,
  1071. rk817_charging_monitor);
  1072. if (ret)
  1073. return ret;
  1074. /* Force the first update immediately. */
  1075. mod_delayed_work(system_wq, &charger->work, 0);
  1076. return 0;
  1077. }
  1078. static struct platform_driver rk817_charger_driver = {
  1079. .probe = rk817_charger_probe,
  1080. .driver = {
  1081. .name = "rk817-charger",
  1082. },
  1083. };
  1084. module_platform_driver(rk817_charger_driver);
  1085. MODULE_DESCRIPTION("Battery power supply driver for RK817 PMIC");
  1086. MODULE_AUTHOR("Maya Matuszczyk <[email protected]>");
  1087. MODULE_AUTHOR("Chris Morgan <[email protected]>");
  1088. MODULE_LICENSE("GPL");
  1089. MODULE_ALIAS("platform:rk817-charger");