rt9471.c 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089
  1. /* Copyright Statement:
  2. *
  3. * This software/firmware and related documentation ("MediaTek Software") are
  4. * protected under relevant copyright laws. The information contained herein
  5. * is confidential and proprietary to MediaTek Inc. and/or its licensors.
  6. * Without the prior written permission of MediaTek inc. and/or its licensors,
  7. * any reproduction, modification, use or disclosure of MediaTek Software,
  8. * and information contained herein, in whole or in part, shall be strictly prohibited.
  9. */
  10. /* MediaTek Inc. (C) 2018. All rights reserved.
  11. *
  12. * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  13. * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  14. * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
  15. * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  16. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  17. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  18. * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  19. * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  20. * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
  21. * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
  22. * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
  23. * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
  24. * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
  25. * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
  26. * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  27. * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  28. * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
  29. * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
  30. */
  31. #include <platform/mt_typedefs.h>
  32. #include <platform/mt_reg_base.h>
  33. #include <platform/errno.h>
  34. #include <platform/mt_i2c.h>
  35. #include <platform/mt_pmic.h>
  36. #include <platform/mt_gpt.h>
  37. #include <printf.h>
  38. #include <string.h>
  39. #include "rt9471.h"
  40. #include "mtk_charger_intf.h"
  41. #include "mtk_charger.h"
  42. #if !defined(CONFIG_POWER_EXT)
  43. #include <platform/upmu_common.h>
  44. #endif
  45. #define RT9471_LK_DRV_VERSION "1.0.1_MTK"
  46. /* ================= */
  47. /* Internal variable */
  48. /* ================= */
  49. enum rt9471_stat_idx {
  50. RT9471_STATIDX_STAT0 = 0,
  51. RT9471_STATIDX_STAT1,
  52. RT9471_STATIDX_STAT2,
  53. RT9471_STATIDX_STAT3,
  54. RT9471_STATIDX_MAX,
  55. };
  56. enum rt9471_irq_idx {
  57. RT9471_IRQIDX_IRQ0 = 0,
  58. RT9471_IRQIDX_IRQ1,
  59. RT9471_IRQIDX_IRQ2,
  60. RT9471_IRQIDX_IRQ3,
  61. RT9471_IRQIDX_MAX,
  62. };
  63. enum rt9471_ic_stat {
  64. RT9471_ICSTAT_SLEEP = 0,
  65. RT9471_ICSTAT_VBUSRDY,
  66. RT9471_ICSTAT_TRICKLECHG,
  67. RT9471_ICSTAT_PRECHG,
  68. RT9471_ICSTAT_FASTCHG,
  69. RT9471_ICSTAT_IEOC,
  70. RT9471_ICSTAT_BGCHG,
  71. RT9471_ICSTAT_CHGDONE,
  72. RT9471_ICSTAT_CHGFAULT,
  73. RT9471_ICSTAT_OTG = 15,
  74. RT9471_ICSTAT_MAX,
  75. };
  76. static const char *rt9471_ic_stat_name[RT9471_ICSTAT_MAX] = {
  77. "hz/sleep", "ready", "trickle-charge", "pre-charge",
  78. "fast-charge", "ieoc-charge", "background-charge",
  79. "done", "fault", "RESERVED", "RESERVED", "RESERVED",
  80. "RESERVED", "RESERVED", "RESERVED", "OTG",
  81. };
  82. enum rt9471_mivr_track {
  83. RT9471_MIVRTRACK_REG = 0,
  84. RT9471_MIVRTRACK_VBAT_200MV,
  85. RT9471_MIVRTRACK_VBAT_250MV,
  86. RT9471_MIVRTRACK_VBAT_300MV,
  87. RT9471_MIVRTRACK_MAX,
  88. };
  89. struct rt9471_desc {
  90. u32 ichg;
  91. u32 aicr;
  92. u32 mivr;
  93. u32 cv;
  94. u32 ieoc;
  95. u32 safe_tmr;
  96. u32 wdt;
  97. u32 mivr_track;
  98. bool en_safe_tmr;
  99. bool en_te;
  100. bool en_jeita;
  101. bool ceb_invert;
  102. bool dis_i2c_tout;
  103. bool en_qon_rst;
  104. bool auto_aicr;
  105. };
  106. static struct rt9471_desc rt9471_default_desc = {
  107. .ichg = 2000000,
  108. .aicr = 500000,
  109. .mivr = 4500000,
  110. .cv = 4350000,
  111. .ieoc = 200000,
  112. .safe_tmr = 10,
  113. .wdt = 40,
  114. .mivr_track = RT9471_MIVRTRACK_REG,
  115. .en_safe_tmr = true,
  116. .en_te = true,
  117. .en_jeita = false,
  118. .ceb_invert = false,
  119. .dis_i2c_tout = false,
  120. .en_qon_rst = true,
  121. .auto_aicr = false,
  122. };
  123. static const u8 rt9471_irq_maskall[RT9471_IRQIDX_MAX] = {
  124. 0xFF, 0xFE, 0xF3, 0xE7,
  125. };
  126. static const u32 rt9471_wdt[] = {
  127. 0, 40, 80, 160,
  128. };
  129. static const u8 rt9471_val_en_hidden_mode[] = {
  130. 0x69, 0x96,
  131. };
  132. struct rt9471_chip {
  133. struct mtk_charger_info mchr_info;
  134. struct mt_i2c_t i2c;
  135. int i2c_log_level;
  136. int hidden_mode_cnt;
  137. struct rt9471_desc *desc;
  138. bool wkard_en;
  139. u32 mivr;
  140. };
  141. /* ======================= */
  142. /* Address & Default value */
  143. /* ======================= */
  144. static const u8 rt9471_reg_addr[] = {
  145. RT9471_REG_OTGCFG,
  146. RT9471_REG_TOP,
  147. RT9471_REG_FUNCTION,
  148. RT9471_REG_IBUS,
  149. RT9471_REG_VBUS,
  150. RT9471_REG_PRECHG,
  151. RT9471_REG_REGU,
  152. RT9471_REG_VCHG,
  153. RT9471_REG_ICHG,
  154. RT9471_REG_CHGTIMER,
  155. RT9471_REG_EOC,
  156. RT9471_REG_INFO,
  157. RT9471_REG_JEITA,
  158. RT9471_REG_DPDMDET,
  159. RT9471_REG_STATUS,
  160. RT9471_REG_STAT0,
  161. RT9471_REG_STAT1,
  162. RT9471_REG_STAT2,
  163. RT9471_REG_STAT3,
  164. /* Skip IRQs to prevent reading clear while dumping registers */
  165. RT9471_REG_MASK0,
  166. RT9471_REG_MASK1,
  167. RT9471_REG_MASK2,
  168. RT9471_REG_MASK3,
  169. };
  170. /* ========================= */
  171. /* I2C operations */
  172. /* ========================= */
  173. static int rt9471_i2c_write_byte(struct rt9471_chip *chip, u8 cmd, u8 data)
  174. {
  175. int ret = I2C_OK;
  176. u8 write_buf[2] = {cmd, data};
  177. struct mt_i2c_t *i2c = &chip->i2c;
  178. ret = i2c_write(i2c, write_buf, 2);
  179. if (ret != I2C_OK)
  180. dprintf(CRITICAL,
  181. "%s I2CW[0x%02X] = 0x%02X fail, code = %d\n",
  182. __func__, cmd, data, ret);
  183. else
  184. dprintf(chip->i2c_log_level, "%s I2CW[0x%02X] = 0x%02X\n",
  185. __func__, cmd, data);
  186. return ret;
  187. }
  188. static int rt9471_i2c_read_byte(struct rt9471_chip *chip, u8 cmd, u8 *data)
  189. {
  190. int ret = I2C_OK;
  191. u8 regval = cmd;
  192. struct mt_i2c_t *i2c = &chip->i2c;
  193. ret = i2c_write_read(i2c, &regval, 1, 1);
  194. if (ret != I2C_OK)
  195. dprintf(CRITICAL, "%s I2CR[0x%02X] fail, code = %d\n",
  196. __func__, cmd, ret);
  197. else {
  198. dprintf(chip->i2c_log_level, "%s I2CR[0x%02X] = 0x%02X\n",
  199. __func__, cmd, regval);
  200. *data = regval;
  201. }
  202. return ret;
  203. }
  204. static int rt9471_i2c_block_write(struct rt9471_chip *chip, u8 cmd, u32 len,
  205. const u8 *data)
  206. {
  207. u8 write_buf[len + 1];
  208. struct mt_i2c_t *i2c = &chip->i2c;
  209. write_buf[0] = cmd;
  210. memcpy(&write_buf[1], data, len);
  211. return i2c_write(i2c, write_buf, len + 1);
  212. }
  213. static int rt9471_i2c_block_read(struct rt9471_chip *chip, u8 cmd, u32 len,
  214. u8 *data)
  215. {
  216. struct mt_i2c_t *i2c = &chip->i2c;
  217. data[0] = cmd;
  218. return i2c_write_read(i2c, data, 1, len);
  219. }
  220. static int rt9471_i2c_test_bit(struct rt9471_chip *chip, u8 cmd, u8 shift,
  221. bool *is_one)
  222. {
  223. int ret = 0;
  224. u8 regval = 0;
  225. ret = rt9471_i2c_read_byte(chip, cmd, &regval);
  226. if (ret != I2C_OK) {
  227. *is_one = false;
  228. return ret;
  229. }
  230. regval &= 1 << shift;
  231. *is_one = (regval ? true : false);
  232. return ret;
  233. }
  234. static int rt9471_i2c_update_bits(struct rt9471_chip *chip, u8 cmd, u8 data,
  235. u8 mask)
  236. {
  237. int ret = 0;
  238. u8 regval = 0;
  239. ret = rt9471_i2c_read_byte(chip, cmd, &regval);
  240. if (ret != I2C_OK)
  241. return ret;
  242. regval &= ~mask;
  243. regval |= (data & mask);
  244. return rt9471_i2c_write_byte(chip, cmd, regval);
  245. }
  246. static inline int rt9471_set_bit(struct rt9471_chip *chip, u8 cmd, u8 mask)
  247. {
  248. return rt9471_i2c_update_bits(chip, cmd, mask, mask);
  249. }
  250. static inline int rt9471_clr_bit(struct rt9471_chip *chip, u8 cmd, u8 mask)
  251. {
  252. return rt9471_i2c_update_bits(chip, cmd, 0x00, mask);
  253. }
  254. static inline u8 rt9471_closest_reg(u32 min, u32 max, u32 step, u32 target)
  255. {
  256. if (target < min)
  257. return 0;
  258. if (target >= max)
  259. return (max - min) / step;
  260. return (target - min) / step;
  261. }
  262. static inline u8 rt9471_closest_reg_via_tbl(const u32 *tbl, u32 tbl_size,
  263. u32 target)
  264. {
  265. u32 i = 0;
  266. if (target < tbl[0])
  267. return 0;
  268. for (i = 0; i < tbl_size - 1; i++) {
  269. if (target >= tbl[i] && target < tbl[i + 1])
  270. return i;
  271. }
  272. return tbl_size - 1;
  273. }
  274. static inline u32 rt9471_closest_value(u32 min, u32 max, u32 step, u8 regval)
  275. {
  276. u32 val = 0;
  277. val = min + regval * step;
  278. if (val > max)
  279. val = max;
  280. return val;
  281. }
  282. static int __rt9471_get_ic_stat(struct rt9471_chip *chip,
  283. enum rt9471_ic_stat *stat)
  284. {
  285. int ret = 0;
  286. u8 regval = 0;
  287. ret = rt9471_i2c_read_byte(chip, RT9471_REG_STATUS, &regval);
  288. if (ret != I2C_OK)
  289. return ret;
  290. *stat = (regval & RT9471_ICSTAT_MASK) >> RT9471_ICSTAT_SHIFT;
  291. return ret;
  292. }
  293. static int __rt9471_get_mivr(struct rt9471_chip *chip, u32 *mivr)
  294. {
  295. int ret = 0;
  296. u8 regval = 0;
  297. ret = rt9471_i2c_read_byte(chip, RT9471_REG_VBUS, &regval);
  298. if (ret != I2C_OK)
  299. return ret;
  300. regval = (regval & RT9471_MIVR_MASK) >> RT9471_MIVR_SHIFT;
  301. *mivr = rt9471_closest_value(RT9471_MIVR_MIN, RT9471_MIVR_MAX,
  302. RT9471_MIVR_STEP, regval);
  303. return ret;
  304. }
  305. static int __rt9471_get_ichg(struct rt9471_chip *chip, u32 *ichg)
  306. {
  307. int ret = 0;
  308. u8 regval = 0;
  309. ret = rt9471_i2c_read_byte(chip, RT9471_REG_ICHG, &regval);
  310. if (ret != I2C_OK)
  311. return ret;
  312. regval = (regval & RT9471_ICHG_MASK) >> RT9471_ICHG_SHIFT;
  313. *ichg = rt9471_closest_value(RT9471_ICHG_MIN, RT9471_ICHG_MAX,
  314. RT9471_ICHG_STEP, regval);
  315. return ret;
  316. }
  317. static int __rt9471_get_aicr(struct rt9471_chip *chip, u32 *aicr)
  318. {
  319. int ret = 0;
  320. u8 regval = 0;
  321. ret = rt9471_i2c_read_byte(chip, RT9471_REG_IBUS, &regval);
  322. if (ret != I2C_OK)
  323. return ret;
  324. regval = (regval & RT9471_AICR_MASK) >> RT9471_AICR_SHIFT;
  325. *aicr = rt9471_closest_value(RT9471_AICR_MIN, RT9471_AICR_MAX,
  326. RT9471_AICR_STEP, regval);
  327. if (*aicr > RT9471_AICR_MIN && *aicr < RT9471_AICR_MAX)
  328. *aicr -= RT9471_AICR_STEP;
  329. return ret;
  330. }
  331. static int __rt9471_get_cv(struct rt9471_chip *chip, u32 *cv)
  332. {
  333. int ret = 0;
  334. u8 regval = 0;
  335. ret = rt9471_i2c_read_byte(chip, RT9471_REG_VCHG, &regval);
  336. if (ret != I2C_OK)
  337. return ret;
  338. regval = (regval & RT9471_CV_MASK) >> RT9471_CV_SHIFT;
  339. *cv = rt9471_closest_value(RT9471_CV_MIN, RT9471_CV_MAX, RT9471_CV_STEP,
  340. regval);
  341. return ret;
  342. }
  343. static int __rt9471_get_ieoc(struct rt9471_chip *chip, u32 *ieoc)
  344. {
  345. int ret = 0;
  346. u8 regval = 0;
  347. ret = rt9471_i2c_read_byte(chip, RT9471_REG_EOC, &regval);
  348. if (ret != I2C_OK)
  349. return ret;
  350. regval = (regval & RT9471_IEOC_MASK) >> RT9471_IEOC_SHIFT;
  351. *ieoc = rt9471_closest_value(RT9471_IEOC_MIN, RT9471_IEOC_MAX,
  352. RT9471_IEOC_STEP, regval);
  353. return ret;
  354. }
  355. static int __rt9471_is_chg_enabled(struct rt9471_chip *chip, bool *en)
  356. {
  357. return rt9471_i2c_test_bit(chip, RT9471_REG_FUNCTION,
  358. RT9471_CHG_EN_SHIFT, en);
  359. }
  360. static int __rt9471_enable_safe_tmr(struct rt9471_chip *chip, bool en)
  361. {
  362. dprintf(INFO, "%s en = %d\n", __func__, en);
  363. return (en ? rt9471_set_bit : rt9471_clr_bit)
  364. (chip, RT9471_REG_CHGTIMER, RT9471_SAFETMR_EN_MASK);
  365. }
  366. static int __rt9471_enable_te(struct rt9471_chip *chip, bool en)
  367. {
  368. dprintf(INFO, "%s en = %d\n", __func__, en);
  369. return (en ? rt9471_set_bit : rt9471_clr_bit)
  370. (chip, RT9471_REG_EOC, RT9471_TE_MASK);
  371. }
  372. static int __rt9471_enable_jeita(struct rt9471_chip *chip, bool en)
  373. {
  374. dprintf(INFO, "%s en = %d\n", __func__, en);
  375. return (en ? rt9471_set_bit : rt9471_clr_bit)
  376. (chip, RT9471_REG_JEITA, RT9471_JEITA_EN_MASK);
  377. }
  378. static int __rt9471_disable_i2c_tout(struct rt9471_chip *chip, bool en)
  379. {
  380. dprintf(INFO, "%s en = %d\n", __func__, en);
  381. return (en ? rt9471_set_bit : rt9471_clr_bit)
  382. (chip, RT9471_REG_TOP, RT9471_DISI2CTO_MASK);
  383. }
  384. static int __rt9471_enable_qon_rst(struct rt9471_chip *chip, bool en)
  385. {
  386. dprintf(INFO, "%s en = %d\n", __func__, en);
  387. return (en ? rt9471_set_bit : rt9471_clr_bit)
  388. (chip, RT9471_REG_TOP, RT9471_QONRST_MASK);
  389. }
  390. static int __rt9471_enable_autoaicr(struct rt9471_chip *chip, bool en)
  391. {
  392. dprintf(INFO, "%s en = %d\n", __func__, en);
  393. return (en ? rt9471_set_bit : rt9471_clr_bit)
  394. (chip, RT9471_REG_IBUS, RT9471_AUTOAICR_MASK);
  395. }
  396. static int __rt9471_enable_chg(struct rt9471_chip *chip, bool en)
  397. {
  398. dprintf(INFO, "%s en = %d\n", __func__, en);
  399. return (en ? rt9471_set_bit : rt9471_clr_bit)
  400. (chip, RT9471_REG_FUNCTION, RT9471_CHG_EN_MASK);
  401. }
  402. static int __rt9471_set_wdt(struct rt9471_chip *chip, u32 sec)
  403. {
  404. u8 regval = 0;
  405. /* 40s is the minimum, set to 40 except sec == 0 */
  406. if (sec <= 40 && sec > 0)
  407. sec = 40;
  408. regval = rt9471_closest_reg_via_tbl(rt9471_wdt, ARRAY_SIZE(rt9471_wdt),
  409. sec);
  410. dprintf(INFO, "%s time = %d(0x%02X)\n", __func__, sec, regval);
  411. return rt9471_i2c_update_bits(chip, RT9471_REG_TOP,
  412. regval << RT9471_WDT_SHIFT,
  413. RT9471_WDT_MASK);
  414. }
  415. static int __rt9471_set_ichg(struct rt9471_chip *chip, u32 ichg)
  416. {
  417. u8 regval = 0;
  418. regval = rt9471_closest_reg(RT9471_ICHG_MIN, RT9471_ICHG_MAX,
  419. RT9471_ICHG_STEP, ichg);
  420. dprintf(INFO, "%s ichg = %d(0x%02X)\n", __func__, ichg, regval);
  421. return rt9471_i2c_update_bits(chip, RT9471_REG_ICHG,
  422. regval << RT9471_ICHG_SHIFT,
  423. RT9471_ICHG_MASK);
  424. }
  425. static int __rt9471_set_aicr(struct rt9471_chip *chip, u32 aicr)
  426. {
  427. u8 regval = 0;
  428. regval = rt9471_closest_reg(RT9471_AICR_MIN, RT9471_AICR_MAX,
  429. RT9471_AICR_STEP, aicr);
  430. /* 0 & 1 are both 50mA */
  431. if (aicr < RT9471_AICR_MAX)
  432. regval += 1;
  433. dprintf(INFO, "%s aicr = %d(0x%02X)\n", __func__, aicr, regval);
  434. return rt9471_i2c_update_bits(chip, RT9471_REG_IBUS,
  435. regval << RT9471_AICR_SHIFT,
  436. RT9471_AICR_MASK);
  437. }
  438. static int __rt9471_set_mivr(struct rt9471_chip *chip, u32 mivr)
  439. {
  440. u8 regval = 0;
  441. regval = rt9471_closest_reg(RT9471_MIVR_MIN, RT9471_MIVR_MAX,
  442. RT9471_MIVR_STEP, mivr);
  443. dprintf(INFO, "%s mivr = %d(0x%02X)\n", __func__, mivr, regval);
  444. return rt9471_i2c_update_bits(chip, RT9471_REG_VBUS,
  445. regval << RT9471_MIVR_SHIFT,
  446. RT9471_MIVR_MASK);
  447. }
  448. static int __rt9471_set_cv(struct rt9471_chip *chip, u32 cv)
  449. {
  450. u8 regval = 0;
  451. regval = rt9471_closest_reg(RT9471_CV_MIN, RT9471_CV_MAX,
  452. RT9471_CV_STEP, cv);
  453. dprintf(INFO, "%s cv = %d(0x%02X)\n", __func__, cv, regval);
  454. return rt9471_i2c_update_bits(chip, RT9471_REG_VCHG,
  455. regval << RT9471_CV_SHIFT,
  456. RT9471_CV_MASK);
  457. }
  458. static int __rt9471_set_ieoc(struct rt9471_chip *chip, u32 ieoc)
  459. {
  460. u8 regval = 0;
  461. regval = rt9471_closest_reg(RT9471_IEOC_MIN, RT9471_IEOC_MAX,
  462. RT9471_IEOC_STEP, ieoc);
  463. dprintf(INFO, "%s ieoc = %d(0x%02X)\n", __func__, ieoc, regval);
  464. return rt9471_i2c_update_bits(chip, RT9471_REG_EOC,
  465. regval << RT9471_IEOC_SHIFT,
  466. RT9471_IEOC_MASK);
  467. }
  468. static int __rt9471_set_safe_tmr(struct rt9471_chip *chip, u32 hr)
  469. {
  470. u8 regval = 0;
  471. regval = rt9471_closest_reg(RT9471_SAFETMR_MIN, RT9471_SAFETMR_MAX,
  472. RT9471_SAFETMR_STEP, hr);
  473. dprintf(INFO, "%s time = %d(0x%02X)\n", __func__, hr, regval);
  474. return rt9471_i2c_update_bits(chip, RT9471_REG_CHGTIMER,
  475. regval << RT9471_SAFETMR_SHIFT,
  476. RT9471_SAFETMR_MASK);
  477. }
  478. static int __rt9471_set_mivrtrack(struct rt9471_chip *chip, u32 mivr_track)
  479. {
  480. if (mivr_track >= RT9471_MIVRTRACK_MAX)
  481. mivr_track = RT9471_MIVRTRACK_VBAT_300MV;
  482. dprintf(INFO, "%s mivrtrack = %d\n", __func__, mivr_track);
  483. return rt9471_i2c_update_bits(chip, RT9471_REG_VBUS,
  484. mivr_track << RT9471_MIVRTRACK_SHIFT,
  485. RT9471_MIVRTRACK_MASK);
  486. }
  487. static int __rt9471_kick_wdt(struct rt9471_chip *chip)
  488. {
  489. dprintf(INFO, "%s\n", __func__);
  490. return rt9471_set_bit(chip, RT9471_REG_TOP, RT9471_WDTCNTRST_MASK);
  491. }
  492. /* ================== */
  493. /* internal functions */
  494. /* ================== */
  495. static bool rt9471_is_hw_exist(struct rt9471_chip *chip)
  496. {
  497. int ret = 0;
  498. u8 info = 0, id = 0, rev = 0;
  499. ret = rt9471_i2c_read_byte(chip, RT9471_REG_INFO, &info);
  500. if (ret != I2C_OK) {
  501. dprintf(CRITICAL, "%s get devinfo fail(%d)\n", __func__, ret);
  502. return false;
  503. }
  504. id = (info & RT9471_DEVID_MASK) >> RT9471_DEVID_SHIFT;
  505. if (id != RT9470_DEVID && id != RT9470D_DEVID &&
  506. id != RT9471_DEVID && id != RT9471D_DEVID) {
  507. dprintf(CRITICAL, "%s incorrect devid 0x%02X\n", __func__,
  508. id);
  509. return false;
  510. }
  511. rev = (info & RT9471_DEVREV_MASK) >> RT9471_DEVREV_SHIFT;
  512. dprintf(INFO, "%s id = 0x%02X, rev = 0x%02X\n", __func__, id, rev);
  513. chip->mchr_info.device_id = rev;
  514. return true;
  515. }
  516. static int rt9471_reset_register(struct rt9471_chip *chip)
  517. {
  518. dprintf(INFO, "%s\n", __func__);
  519. return rt9471_set_bit(chip, RT9471_REG_INFO, RT9471_REGRST_MASK);
  520. }
  521. static int rt9471_enable_hidden_mode(struct rt9471_chip *chip, bool en)
  522. {
  523. int ret = 0;
  524. if (en) {
  525. if (chip->hidden_mode_cnt == 0) {
  526. ret = rt9471_i2c_block_write(chip, 0xA0,
  527. ARRAY_SIZE(rt9471_val_en_hidden_mode),
  528. rt9471_val_en_hidden_mode);
  529. if (ret != I2C_OK)
  530. goto err;
  531. }
  532. chip->hidden_mode_cnt++;
  533. } else {
  534. if (chip->hidden_mode_cnt == 1) /* last one */
  535. ret = rt9471_i2c_write_byte(chip, 0xA0, 0x00);
  536. chip->hidden_mode_cnt--;
  537. if (ret != I2C_OK)
  538. goto err;
  539. }
  540. dprintf(SPEW, "%s en = %d, cnt = %d\n", __func__,
  541. en, chip->hidden_mode_cnt);
  542. goto out;
  543. err:
  544. dprintf(CRITICAL, "%s en = %d fail(%d)\n", __func__, en, ret);
  545. out:
  546. return ret;
  547. }
  548. static int rt9471_sw_workaround(struct rt9471_chip *chip)
  549. {
  550. int ret = 0;
  551. u8 regval = 0, chip_rev = 0;
  552. dprintf(INFO, "%s\n", __func__);
  553. ret = rt9471_enable_hidden_mode(chip, true);
  554. if (ret != I2C_OK) {
  555. dprintf(CRITICAL, "%s enter hidden mode fail(%d)\n",
  556. __func__, ret);
  557. return ret;
  558. }
  559. ret = rt9471_i2c_read_byte(chip, RT9471_REG_HIDDEN_0, &regval);
  560. if (ret != I2C_OK) {
  561. dprintf(CRITICAL, "%s read HIDDEN_0 fail(%d)\n",
  562. __func__, ret);
  563. goto out;
  564. }
  565. chip_rev = (regval & RT9471_CHIP_REV_MASK) >> RT9471_CHIP_REV_SHIFT;
  566. dprintf(INFO, "%s chip_rev = %d\n", __func__, chip_rev);
  567. /* OTG load transient improvement */
  568. if (chip_rev <= 3)
  569. ret = rt9471_i2c_update_bits(chip, RT9471_REG_OTG_HDEN2, 0x10,
  570. RT9471_REG_OTG_RES_COMP_MASK);
  571. out:
  572. rt9471_enable_hidden_mode(chip, false);
  573. return ret;
  574. }
  575. static int rt9471_init_setting(struct rt9471_chip *chip)
  576. {
  577. int ret = 0;
  578. struct rt9471_desc *desc = chip->desc;
  579. u8 evt[RT9471_IRQIDX_MAX] = {0};
  580. dprintf(INFO, "%s\n", __func__);
  581. /* Disable WDT during IRQ masked period */
  582. ret = __rt9471_set_wdt(chip, 0);
  583. if (ret != I2C_OK)
  584. dprintf(CRITICAL, "%s set wdt fail(%d)\n", __func__, ret);
  585. /* Mask all IRQs */
  586. ret = rt9471_i2c_block_write(chip, RT9471_REG_MASK0,
  587. ARRAY_SIZE(rt9471_irq_maskall),
  588. rt9471_irq_maskall);
  589. if (ret != I2C_OK)
  590. dprintf(CRITICAL, "%s mask irq fail(%d)\n", __func__, ret);
  591. /* Clear all IRQs */
  592. ret = rt9471_i2c_block_read(chip, RT9471_REG_IRQ0, RT9471_IRQIDX_MAX,
  593. evt);
  594. if (ret != I2C_OK)
  595. dprintf(CRITICAL, "%s clear irq fail(%d)\n", __func__, ret);
  596. ret = __rt9471_set_ichg(chip, desc->ichg);
  597. if (ret != I2C_OK)
  598. dprintf(CRITICAL, "%s set ichg fail(%d)\n", __func__, ret);
  599. ret = __rt9471_set_aicr(chip, desc->aicr);
  600. if (ret != I2C_OK)
  601. dprintf(CRITICAL, "%s set aicr fail(%d)\n", __func__, ret);
  602. ret = __rt9471_set_mivr(chip, desc->mivr);
  603. if (ret != I2C_OK)
  604. dprintf(CRITICAL, "%s set mivr fail(%d)\n", __func__, ret);
  605. ret = __rt9471_set_cv(chip, desc->cv);
  606. if (ret != I2C_OK)
  607. dprintf(CRITICAL, "%s set cv fail(%d)\n", __func__, ret);
  608. ret = __rt9471_set_ieoc(chip, desc->ieoc);
  609. if (ret != I2C_OK)
  610. dprintf(CRITICAL, "%s set ieoc fail(%d)\n", __func__, ret);
  611. ret = __rt9471_set_safe_tmr(chip, desc->safe_tmr);
  612. if (ret != I2C_OK)
  613. dprintf(CRITICAL, "%s set safe tmr fail(%d)\n", __func__, ret);
  614. ret = __rt9471_set_wdt(chip, desc->wdt);
  615. if (ret != I2C_OK)
  616. dprintf(CRITICAL, "%s set wdt fail(%d)\n", __func__, ret);
  617. ret = __rt9471_set_mivrtrack(chip, desc->mivr_track);
  618. if (ret != I2C_OK)
  619. dprintf(CRITICAL, "%s set mivrtrack fail(%d)\n",
  620. __func__, ret);
  621. ret = __rt9471_enable_safe_tmr(chip, desc->en_safe_tmr);
  622. if (ret != I2C_OK)
  623. dprintf(CRITICAL, "%s en safe tmr fail(%d)\n", __func__, ret);
  624. ret = __rt9471_enable_te(chip, desc->en_te);
  625. if (ret != I2C_OK)
  626. dprintf(CRITICAL, "%s en te fail(%d)\n", __func__, ret);
  627. ret = __rt9471_enable_jeita(chip, desc->en_jeita);
  628. if (ret != I2C_OK)
  629. dprintf(CRITICAL, "%s en jeita fail(%d)\n", __func__, ret);
  630. ret = __rt9471_disable_i2c_tout(chip, desc->dis_i2c_tout);
  631. if (ret != I2C_OK)
  632. dprintf(CRITICAL, "%s dis i2c tout fail(%d)\n", __func__, ret);
  633. ret = __rt9471_enable_qon_rst(chip, desc->en_qon_rst);
  634. if (ret != I2C_OK)
  635. dprintf(CRITICAL, "%s en qon rst fail(%d)\n", __func__, ret);
  636. ret = __rt9471_enable_autoaicr(chip, desc->auto_aicr);
  637. if (ret != I2C_OK)
  638. dprintf(CRITICAL, "%s en autoaicr fail(%d)\n", __func__, ret);
  639. ret = rt9471_sw_workaround(chip);
  640. if (ret != I2C_OK)
  641. dprintf(CRITICAL, "%s set sw workaround fail(%d)\n",
  642. __func__, ret);
  643. return 0;
  644. }
  645. /* =========================================================== */
  646. /* The following is implementation for interface of rt_charger */
  647. /* =========================================================== */
  648. static int rt_charger_dump_register(struct mtk_charger_info *mchr_info)
  649. {
  650. int ret = 0;
  651. u32 i = 0, ichg = 0, aicr = 0, mivr = 0, ieoc = 0, cv = 0;
  652. bool chg_en = 0;
  653. enum rt9471_ic_stat ic_stat = RT9471_ICSTAT_SLEEP;
  654. u8 stats[RT9471_STATIDX_MAX] = {0}, regval = 0;
  655. struct rt9471_chip *chip = (struct rt9471_chip *)mchr_info;
  656. ret = __rt9471_get_ichg(chip, &ichg);
  657. ret = __rt9471_get_aicr(chip, &aicr);
  658. ret = __rt9471_get_mivr(chip, &mivr);
  659. ret = __rt9471_get_ieoc(chip, &ieoc);
  660. ret = __rt9471_get_cv(chip, &cv);
  661. ret = __rt9471_is_chg_enabled(chip, &chg_en);
  662. ret = __rt9471_get_ic_stat(chip, &ic_stat);
  663. ret = rt9471_i2c_block_read(chip, RT9471_REG_STAT0, RT9471_STATIDX_MAX,
  664. stats);
  665. if (ic_stat == RT9471_ICSTAT_CHGFAULT) {
  666. for (i = 0; i < ARRAY_SIZE(rt9471_reg_addr); i++) {
  667. ret = rt9471_i2c_read_byte(chip, rt9471_reg_addr[i],
  668. &regval);
  669. if (ret != I2C_OK)
  670. continue;
  671. dprintf(INFO, "%s reg0x%02X = 0x%02X\n", __func__,
  672. rt9471_reg_addr[i], regval);
  673. }
  674. }
  675. dprintf(INFO,
  676. "%s ICHG = %dmA, AICR = %dmA, MIVR = %dmV\n",
  677. __func__, ichg / 1000, aicr / 1000, mivr / 1000);
  678. dprintf(INFO, "%s IEOC = %dmA, CV = %dmV\n",
  679. __func__, ieoc / 1000, cv / 1000);
  680. dprintf(INFO, "%s CHG_EN = %d, IC_STAT = %s\n",
  681. __func__, chg_en, rt9471_ic_stat_name[ic_stat]);
  682. dprintf(INFO,
  683. "%s STAT0 = 0x%02X, STAT1 = 0x%02X\n", __func__,
  684. stats[RT9471_STATIDX_STAT0], stats[RT9471_STATIDX_STAT1]);
  685. dprintf(INFO,
  686. "%s STAT2 = 0x%02X, STAT3 = 0x%02X\n", __func__,
  687. stats[RT9471_STATIDX_STAT2], stats[RT9471_STATIDX_STAT3]);
  688. return 0;
  689. }
  690. static int rt_charger_enable_charging(struct mtk_charger_info *mchr_info,
  691. bool en)
  692. {
  693. struct rt9471_chip *chip = (struct rt9471_chip *)mchr_info;
  694. return __rt9471_enable_chg(chip, en);
  695. }
  696. static int rt_charger_get_ichg(struct mtk_charger_info *mchr_info, u32 *ichg)
  697. {
  698. int ret = 0;
  699. struct rt9471_chip *chip = (struct rt9471_chip *)mchr_info;
  700. ret = __rt9471_get_ichg(chip, ichg);
  701. *ichg /= 1000; /* uA --> mA */
  702. return ret;
  703. }
  704. static int rt_charger_set_ichg(struct mtk_charger_info *mchr_info, u32 ichg)
  705. {
  706. struct rt9471_chip *chip = (struct rt9471_chip *)mchr_info;
  707. return __rt9471_set_ichg(chip, ichg * 1000);
  708. }
  709. static int rt_charger_get_aicr(struct mtk_charger_info *mchr_info, u32 *aicr)
  710. {
  711. int ret = 0;
  712. struct rt9471_chip *chip = (struct rt9471_chip *)mchr_info;
  713. ret = __rt9471_get_aicr(chip, aicr);
  714. *aicr /= 1000; /* uA --> mA */
  715. return ret;
  716. }
  717. static int rt_charger_set_aicr(struct mtk_charger_info *mchr_info, u32 aicr)
  718. {
  719. struct rt9471_chip *chip = (struct rt9471_chip *)mchr_info;
  720. return __rt9471_set_aicr(chip, aicr * 1000);
  721. }
  722. static int rt_charger_set_mivr(struct mtk_charger_info *mchr_info, u32 mivr)
  723. {
  724. int ret = 0;
  725. struct rt9471_chip *chip = (struct rt9471_chip *)mchr_info;
  726. ret = __rt9471_set_mivr(chip, mivr * 1000);
  727. if (ret == I2C_OK)
  728. chip->mivr = mivr * 1000;
  729. return ret;
  730. }
  731. static int rt_charger_enable_power_path(struct mtk_charger_info *mchr_info,
  732. bool en)
  733. {
  734. struct rt9471_chip *chip = (struct rt9471_chip *)mchr_info;
  735. u32 mivr = (en ? chip->mivr : RT9471_MIVR_MAX);
  736. dprintf(INFO, "%s en = %d\n", __func__, en);
  737. return __rt9471_set_mivr(chip, mivr);
  738. }
  739. static int rt_charger_enable_wdt(struct mtk_charger_info *mchr_info, bool en)
  740. {
  741. struct rt9471_chip *chip = (struct rt9471_chip *)mchr_info;
  742. return __rt9471_set_wdt(chip, en ? chip->desc->wdt : 0);
  743. }
  744. static int rt_charger_sw_reset(struct mtk_charger_info *mchr_info)
  745. {
  746. struct rt9471_chip *chip = (struct rt9471_chip *)mchr_info;
  747. return rt9471_reset_register(chip);
  748. }
  749. static int rt_charger_reset_wdt(struct mtk_charger_info *mchr_info)
  750. {
  751. struct rt9471_chip *chip = (struct rt9471_chip *)mchr_info;
  752. return __rt9471_kick_wdt(chip);
  753. }
  754. static inline int rt9471_fix_current_accuracy(struct rt9471_chip *chip, bool en)
  755. {
  756. int ret = 0;
  757. if (!(chip->wkard_en ^ en))
  758. return 0;
  759. ret = rt9471_enable_hidden_mode(chip, true);
  760. if (ret != I2C_OK) {
  761. dprintf(CRITICAL, "%s enter hidden mode fail(%d)\n",
  762. __func__, ret);
  763. return ret;
  764. }
  765. if (en) {
  766. ret = rt9471_i2c_write_byte(chip, RT9471_REG_BUCK_HDEN4, 0x77);
  767. if (ret != I2C_OK) {
  768. dprintf(CRITICAL, "%s set reg0x55 fail(%d)\n",
  769. __func__, ret);
  770. goto out;
  771. }
  772. ret = rt9471_i2c_write_byte(chip, RT9471_REG_BUCK_HDEN3, 0xC0);
  773. if (ret != I2C_OK) {
  774. dprintf(CRITICAL, "%s set reg0x54 fail(%d)\n",
  775. __func__, ret);
  776. goto out;
  777. }
  778. } else {
  779. ret = rt9471_i2c_write_byte(chip, RT9471_REG_BUCK_HDEN4, 0x71);
  780. if (ret != I2C_OK) {
  781. dprintf(CRITICAL, "%s set reg0x55 fail(%d)\n",
  782. __func__, ret);
  783. goto out;
  784. }
  785. ret = rt9471_i2c_write_byte(chip, RT9471_REG_BUCK_HDEN3, 0xF0);
  786. if (ret != I2C_OK) {
  787. dprintf(CRITICAL, "%s set reg0x54 fail(%d)\n",
  788. __func__, ret);
  789. goto out;
  790. }
  791. }
  792. chip->wkard_en = en;
  793. out:
  794. rt9471_enable_hidden_mode(chip, false);
  795. return ret;
  796. }
  797. static int rt_charger_check_charging_mode(struct mtk_charger_info *mchr_info)
  798. {
  799. int ret = 0;
  800. struct rt9471_chip *chip = (struct rt9471_chip *)mchr_info;
  801. static enum rt9471_ic_stat pre_stat = RT9471_ICSTAT_SLEEP;
  802. enum rt9471_ic_stat cur_stat = RT9471_ICSTAT_SLEEP;
  803. dprintf(INFO, "%s\n", __func__);
  804. __rt9471_kick_wdt(chip);
  805. ret = __rt9471_get_ic_stat(chip, &cur_stat);
  806. if (ret != I2C_OK) {
  807. dprintf(CRITICAL, "%s get ic stat fail(%d)\n", __func__, ret);
  808. return ret;
  809. }
  810. dprintf(INFO, "%s in %s stat, previously in %s stat\n", __func__,
  811. rt9471_ic_stat_name[cur_stat],
  812. rt9471_ic_stat_name[pre_stat]);
  813. if (cur_stat == pre_stat)
  814. return 0;
  815. switch (cur_stat) {
  816. case RT9471_ICSTAT_TRICKLECHG:
  817. case RT9471_ICSTAT_PRECHG:
  818. ret = rt9471_fix_current_accuracy(chip, true);
  819. if (ret != I2C_OK) {
  820. dprintf(CRITICAL, "%s fix current accuracy fail(%d)\n",
  821. __func__, ret);
  822. return ret;
  823. }
  824. break;
  825. case RT9471_ICSTAT_CHGFAULT:
  826. rt_charger_dump_register(mchr_info);
  827. default:
  828. ret = rt9471_fix_current_accuracy(chip, false);
  829. if (ret != I2C_OK) {
  830. dprintf(CRITICAL, "%s fix current accuracy fail(%d)\n",
  831. __func__, ret);
  832. return ret;
  833. }
  834. break;
  835. }
  836. pre_stat = cur_stat;
  837. return ret;
  838. }
  839. static struct mtk_charger_ops rt9471_mchr_ops = {
  840. .dump_register = rt_charger_dump_register,
  841. .enable_charging = rt_charger_enable_charging,
  842. .get_ichg = rt_charger_get_ichg,
  843. .set_ichg = rt_charger_set_ichg,
  844. .get_aicr = rt_charger_get_aicr,
  845. .set_aicr = rt_charger_set_aicr,
  846. .set_mivr = rt_charger_set_mivr,
  847. .enable_power_path = rt_charger_enable_power_path,
  848. .enable_wdt = rt_charger_enable_wdt,
  849. .reset_wdt = rt_charger_reset_wdt,
  850. .sw_reset = rt_charger_sw_reset,
  851. .check_charging_mode = rt_charger_check_charging_mode,
  852. };
  853. /* Info of primary charger */
  854. static struct rt9471_chip g_rt9471_chip = {
  855. .mchr_info = {
  856. .name = "primary_charger",
  857. .alias_name = "rt9471",
  858. .device_id = -1,
  859. .mchr_ops = &rt9471_mchr_ops,
  860. },
  861. .i2c = {
  862. .id = I2C5,
  863. .addr = RT9471_SLAVE_ADDR,
  864. .mode = FS_MODE,
  865. .speed = 400,
  866. },
  867. .i2c_log_level = INFO,
  868. .hidden_mode_cnt = 0,
  869. .desc = &rt9471_default_desc,
  870. .wkard_en = false,
  871. .mivr = 4500000,
  872. };
  873. int rt9471_probe(void)
  874. {
  875. int ret = 0;
  876. if (rt9471_is_hw_exist(&g_rt9471_chip)) {
  877. ret = rt9471_reset_register(&g_rt9471_chip);
  878. ret |= rt9471_init_setting(&g_rt9471_chip);
  879. mtk_charger_set_info(&g_rt9471_chip.mchr_info);
  880. dprintf(INFO, "%s (%s)\n", __func__, RT9471_LK_DRV_VERSION);
  881. }
  882. return ret;
  883. }
  884. /*
  885. * Revision Note
  886. * 1.0.1
  887. * (1) Kick WDT in rt_charger_check_charging_mode()
  888. * (2) Add support for RT9470/RT9470D
  889. * (3) Sync with Kernel Driver
  890. *
  891. * 1.0.0
  892. * (1) Support E2 chip
  893. */