rt9467-charger.c 34 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (C) 2022 Richtek Technology Corp.
  4. *
  5. * Author: ChiYuan Huang <cy_huang@richtek.com>
  6. * ChiaEn Wu <chiaen_wu@richtek.com>
  7. */
  8. #include <linux/bits.h>
  9. #include <linux/bitfield.h>
  10. #include <linux/completion.h>
  11. #include <linux/delay.h>
  12. #include <linux/gpio/consumer.h>
  13. #include <linux/i2c.h>
  14. #include <linux/interrupt.h>
  15. #include <linux/kernel.h>
  16. #include <linux/kstrtox.h>
  17. #include <linux/linear_range.h>
  18. #include <linux/module.h>
  19. #include <linux/mod_devicetable.h>
  20. #include <linux/mutex.h>
  21. #include <linux/of.h>
  22. #include <linux/power_supply.h>
  23. #include <linux/regmap.h>
  24. #include <linux/regulator/driver.h>
  25. #include <linux/units.h>
  26. #include <linux/sysfs.h>
  27. #define RT9467_REG_CORE_CTRL0 0x00
  28. #define RT9467_REG_CHG_CTRL1 0x01
  29. #define RT9467_REG_CHG_CTRL2 0x02
  30. #define RT9467_REG_CHG_CTRL3 0x03
  31. #define RT9467_REG_CHG_CTRL4 0x04
  32. #define RT9467_REG_CHG_CTRL5 0x05
  33. #define RT9467_REG_CHG_CTRL6 0x06
  34. #define RT9467_REG_CHG_CTRL7 0x07
  35. #define RT9467_REG_CHG_CTRL8 0x08
  36. #define RT9467_REG_CHG_CTRL9 0x09
  37. #define RT9467_REG_CHG_CTRL10 0x0A
  38. #define RT9467_REG_CHG_CTRL12 0x0C
  39. #define RT9467_REG_CHG_CTRL13 0x0D
  40. #define RT9467_REG_CHG_CTRL14 0x0E
  41. #define RT9467_REG_CHG_ADC 0x11
  42. #define RT9467_REG_CHG_DPDM1 0x12
  43. #define RT9467_REG_CHG_DPDM2 0x13
  44. #define RT9467_REG_DEVICE_ID 0x40
  45. #define RT9467_REG_CHG_STAT 0x42
  46. #define RT9467_REG_ADC_DATA_H 0x44
  47. #define RT9467_REG_CHG_STATC 0x50
  48. #define RT9467_REG_CHG_IRQ1 0x53
  49. #define RT9467_REG_CHG_STATC_CTRL 0x60
  50. #define RT9467_REG_CHG_IRQ1_CTRL 0x63
  51. #define RT9467_MASK_PWR_RDY BIT(7)
  52. #define RT9467_MASK_MIVR_STAT BIT(6)
  53. #define RT9467_MASK_OTG_CSEL GENMASK(2, 0)
  54. #define RT9467_MASK_OTG_VSEL GENMASK(7, 2)
  55. #define RT9467_MASK_OTG_EN BIT(0)
  56. #define RT9467_MASK_ADC_IN_SEL GENMASK(7, 4)
  57. #define RT9467_MASK_ADC_START BIT(0)
  58. #define RT9467_NUM_IRQ_REGS 4
  59. #define RT9467_ICHG_MIN_uA 100000
  60. #define RT9467_ICHG_MAX_uA 5000000
  61. #define RT9467_CV_MAX_uV 4710000
  62. #define RT9467_OTG_MIN_uV 4425000
  63. #define RT9467_OTG_MAX_uV 5825000
  64. #define RT9467_OTG_STEP_uV 25000
  65. #define RT9467_NUM_VOTG (RT9467_OTG_MAX_uV - RT9467_OTG_MIN_uV + 1)
  66. #define RT9467_AICLVTH_GAP_uV 200000
  67. #define RT9467_ADCCONV_TIME_MS 35
  68. #define RT9466_VID 0x8
  69. #define RT9467_VID 0x9
  70. /* IRQ number */
  71. #define RT9467_IRQ_TS_STATC 0
  72. #define RT9467_IRQ_CHG_FAULT 1
  73. #define RT9467_IRQ_CHG_STATC 2
  74. #define RT9467_IRQ_CHG_TMR 3
  75. #define RT9467_IRQ_CHG_BATABS 4
  76. #define RT9467_IRQ_CHG_ADPBAD 5
  77. #define RT9467_IRQ_CHG_RVP 6
  78. #define RT9467_IRQ_OTP 7
  79. #define RT9467_IRQ_CHG_AICLM 8
  80. #define RT9467_IRQ_CHG_ICHGM 9
  81. #define RT9467_IRQ_WDTMR 11
  82. #define RT9467_IRQ_SSFINISH 12
  83. #define RT9467_IRQ_CHG_RECHG 13
  84. #define RT9467_IRQ_CHG_TERM 14
  85. #define RT9467_IRQ_CHG_IEOC 15
  86. #define RT9467_IRQ_ADC_DONE 16
  87. #define RT9467_IRQ_PUMPX_DONE 17
  88. #define RT9467_IRQ_BST_BATUV 21
  89. #define RT9467_IRQ_BST_MIDOV 22
  90. #define RT9467_IRQ_BST_OLP 23
  91. #define RT9467_IRQ_ATTACH 24
  92. #define RT9467_IRQ_DETACH 25
  93. #define RT9467_IRQ_HVDCP_DET 29
  94. #define RT9467_IRQ_CHGDET 30
  95. #define RT9467_IRQ_DCDT 31
  96. enum rt9467_fields {
  97. /* RT9467_REG_CORE_CTRL0 */
  98. F_RST = 0,
  99. /* RT9467_REG_CHG_CTRL1 */
  100. F_HZ, F_OTG_PIN_EN, F_OPA_MODE,
  101. /* RT9467_REG_CHG_CTRL2 */
  102. F_SHIP_MODE, F_TE, F_IINLMTSEL, F_CFO_EN, F_CHG_EN,
  103. /* RT9467_REG_CHG_CTRL3 */
  104. F_IAICR, F_ILIM_EN,
  105. /* RT9467_REG_CHG_CTRL4 */
  106. F_VOREG,
  107. /* RT9467_REG_CHG_CTRL6 */
  108. F_VMIVR,
  109. /* RT9467_REG_CHG_CTRL7 */
  110. F_ICHG,
  111. /* RT9467_REG_CHG_CTRL8 */
  112. F_IPREC,
  113. /* RT9467_REG_CHG_CTRL9 */
  114. F_IEOC,
  115. /* RT9467_REG_CHG_CTRL12 */
  116. F_WT_FC,
  117. /* RT9467_REG_CHG_CTRL13 */
  118. F_OCP,
  119. /* RT9467_REG_CHG_CTRL14 */
  120. F_AICL_MEAS, F_AICL_VTH,
  121. /* RT9467_REG_CHG_DPDM1 */
  122. F_USBCHGEN,
  123. /* RT9467_REG_CHG_DPDM2 */
  124. F_USB_STATUS,
  125. /* RT9467_REG_DEVICE_ID */
  126. F_VENDOR,
  127. /* RT9467_REG_CHG_STAT */
  128. F_CHG_STAT,
  129. /* RT9467_REG_CHG_STATC */
  130. F_PWR_RDY, F_CHG_MIVR,
  131. F_MAX_FIELDS
  132. };
  133. static const struct regmap_irq rt9467_irqs[] = {
  134. REGMAP_IRQ_REG_LINE(RT9467_IRQ_TS_STATC, 8),
  135. REGMAP_IRQ_REG_LINE(RT9467_IRQ_CHG_FAULT, 8),
  136. REGMAP_IRQ_REG_LINE(RT9467_IRQ_CHG_STATC, 8),
  137. REGMAP_IRQ_REG_LINE(RT9467_IRQ_CHG_TMR, 8),
  138. REGMAP_IRQ_REG_LINE(RT9467_IRQ_CHG_BATABS, 8),
  139. REGMAP_IRQ_REG_LINE(RT9467_IRQ_CHG_ADPBAD, 8),
  140. REGMAP_IRQ_REG_LINE(RT9467_IRQ_CHG_RVP, 8),
  141. REGMAP_IRQ_REG_LINE(RT9467_IRQ_OTP, 8),
  142. REGMAP_IRQ_REG_LINE(RT9467_IRQ_CHG_AICLM, 8),
  143. REGMAP_IRQ_REG_LINE(RT9467_IRQ_CHG_ICHGM, 8),
  144. REGMAP_IRQ_REG_LINE(RT9467_IRQ_WDTMR, 8),
  145. REGMAP_IRQ_REG_LINE(RT9467_IRQ_SSFINISH, 8),
  146. REGMAP_IRQ_REG_LINE(RT9467_IRQ_CHG_RECHG, 8),
  147. REGMAP_IRQ_REG_LINE(RT9467_IRQ_CHG_TERM, 8),
  148. REGMAP_IRQ_REG_LINE(RT9467_IRQ_CHG_IEOC, 8),
  149. REGMAP_IRQ_REG_LINE(RT9467_IRQ_ADC_DONE, 8),
  150. REGMAP_IRQ_REG_LINE(RT9467_IRQ_PUMPX_DONE, 8),
  151. REGMAP_IRQ_REG_LINE(RT9467_IRQ_BST_BATUV, 8),
  152. REGMAP_IRQ_REG_LINE(RT9467_IRQ_BST_MIDOV, 8),
  153. REGMAP_IRQ_REG_LINE(RT9467_IRQ_BST_OLP, 8),
  154. REGMAP_IRQ_REG_LINE(RT9467_IRQ_ATTACH, 8),
  155. REGMAP_IRQ_REG_LINE(RT9467_IRQ_DETACH, 8),
  156. REGMAP_IRQ_REG_LINE(RT9467_IRQ_HVDCP_DET, 8),
  157. REGMAP_IRQ_REG_LINE(RT9467_IRQ_CHGDET, 8),
  158. REGMAP_IRQ_REG_LINE(RT9467_IRQ_DCDT, 8)
  159. };
  160. static const struct regmap_irq_chip rt9467_irq_chip = {
  161. .name = "rt9467-irqs",
  162. .status_base = RT9467_REG_CHG_IRQ1,
  163. .mask_base = RT9467_REG_CHG_IRQ1_CTRL,
  164. .num_regs = RT9467_NUM_IRQ_REGS,
  165. .irqs = rt9467_irqs,
  166. .num_irqs = ARRAY_SIZE(rt9467_irqs),
  167. };
  168. enum rt9467_ranges {
  169. RT9467_RANGE_IAICR = 0,
  170. RT9467_RANGE_VOREG,
  171. RT9467_RANGE_VMIVR,
  172. RT9467_RANGE_ICHG,
  173. RT9467_RANGE_IPREC,
  174. RT9467_RANGE_IEOC,
  175. RT9467_RANGE_AICL_VTH,
  176. RT9467_RANGES_MAX
  177. };
  178. static const struct linear_range rt9467_ranges[RT9467_RANGES_MAX] = {
  179. LINEAR_RANGE_IDX(RT9467_RANGE_IAICR, 100000, 0x0, 0x3F, 50000),
  180. LINEAR_RANGE_IDX(RT9467_RANGE_VOREG, 3900000, 0x0, 0x51, 10000),
  181. LINEAR_RANGE_IDX(RT9467_RANGE_VMIVR, 3900000, 0x0, 0x5F, 100000),
  182. LINEAR_RANGE_IDX(RT9467_RANGE_ICHG, 900000, 0x08, 0x31, 100000),
  183. LINEAR_RANGE_IDX(RT9467_RANGE_IPREC, 100000, 0x0, 0x0F, 50000),
  184. LINEAR_RANGE_IDX(RT9467_RANGE_IEOC, 100000, 0x0, 0x0F, 50000),
  185. LINEAR_RANGE_IDX(RT9467_RANGE_AICL_VTH, 4100000, 0x0, 0x7, 100000),
  186. };
  187. static const struct reg_field rt9467_chg_fields[] = {
  188. [F_RST] = REG_FIELD(RT9467_REG_CORE_CTRL0, 7, 7),
  189. [F_HZ] = REG_FIELD(RT9467_REG_CHG_CTRL1, 2, 2),
  190. [F_OTG_PIN_EN] = REG_FIELD(RT9467_REG_CHG_CTRL1, 1, 1),
  191. [F_OPA_MODE] = REG_FIELD(RT9467_REG_CHG_CTRL1, 0, 0),
  192. [F_SHIP_MODE] = REG_FIELD(RT9467_REG_CHG_CTRL2, 7, 7),
  193. [F_TE] = REG_FIELD(RT9467_REG_CHG_CTRL2, 4, 4),
  194. [F_IINLMTSEL] = REG_FIELD(RT9467_REG_CHG_CTRL2, 2, 3),
  195. [F_CFO_EN] = REG_FIELD(RT9467_REG_CHG_CTRL2, 1, 1),
  196. [F_CHG_EN] = REG_FIELD(RT9467_REG_CHG_CTRL2, 0, 0),
  197. [F_IAICR] = REG_FIELD(RT9467_REG_CHG_CTRL3, 2, 7),
  198. [F_ILIM_EN] = REG_FIELD(RT9467_REG_CHG_CTRL3, 0, 0),
  199. [F_VOREG] = REG_FIELD(RT9467_REG_CHG_CTRL4, 1, 7),
  200. [F_VMIVR] = REG_FIELD(RT9467_REG_CHG_CTRL6, 1, 7),
  201. [F_ICHG] = REG_FIELD(RT9467_REG_CHG_CTRL7, 2, 7),
  202. [F_IPREC] = REG_FIELD(RT9467_REG_CHG_CTRL8, 0, 3),
  203. [F_IEOC] = REG_FIELD(RT9467_REG_CHG_CTRL9, 4, 7),
  204. [F_WT_FC] = REG_FIELD(RT9467_REG_CHG_CTRL12, 5, 7),
  205. [F_OCP] = REG_FIELD(RT9467_REG_CHG_CTRL13, 2, 2),
  206. [F_AICL_MEAS] = REG_FIELD(RT9467_REG_CHG_CTRL14, 7, 7),
  207. [F_AICL_VTH] = REG_FIELD(RT9467_REG_CHG_CTRL14, 0, 2),
  208. [F_USBCHGEN] = REG_FIELD(RT9467_REG_CHG_DPDM1, 7, 7),
  209. [F_USB_STATUS] = REG_FIELD(RT9467_REG_CHG_DPDM2, 0, 2),
  210. [F_VENDOR] = REG_FIELD(RT9467_REG_DEVICE_ID, 4, 7),
  211. [F_CHG_STAT] = REG_FIELD(RT9467_REG_CHG_STAT, 6, 7),
  212. [F_PWR_RDY] = REG_FIELD(RT9467_REG_CHG_STATC, 7, 7),
  213. [F_CHG_MIVR] = REG_FIELD(RT9467_REG_CHG_STATC, 6, 6),
  214. };
  215. enum {
  216. RT9467_STAT_READY = 0,
  217. RT9467_STAT_PROGRESS,
  218. RT9467_STAT_CHARGE_DONE,
  219. RT9467_STAT_FAULT
  220. };
  221. enum rt9467_adc_chan {
  222. RT9467_ADC_VBUS_DIV5 = 0,
  223. RT9467_ADC_VBUS_DIV2,
  224. RT9467_ADC_VSYS,
  225. RT9467_ADC_VBAT,
  226. RT9467_ADC_TS_BAT,
  227. RT9467_ADC_IBUS,
  228. RT9467_ADC_IBAT,
  229. RT9467_ADC_REGN,
  230. RT9467_ADC_TEMP_JC
  231. };
  232. enum rt9467_chg_type {
  233. RT9467_CHG_TYPE_NOVBUS = 0,
  234. RT9467_CHG_TYPE_UNDER_GOING,
  235. RT9467_CHG_TYPE_SDP,
  236. RT9467_CHG_TYPE_SDPNSTD,
  237. RT9467_CHG_TYPE_DCP,
  238. RT9467_CHG_TYPE_CDP,
  239. RT9467_CHG_TYPE_MAX
  240. };
  241. enum rt9467_iin_limit_sel {
  242. RT9467_IINLMTSEL_3_2A = 0,
  243. RT9467_IINLMTSEL_CHG_TYP,
  244. RT9467_IINLMTSEL_AICR,
  245. RT9467_IINLMTSEL_LOWER_LEVEL, /* lower of above three */
  246. };
  247. struct rt9467_chg_data {
  248. struct device *dev;
  249. struct regmap *regmap;
  250. struct regmap_field *rm_field[F_MAX_FIELDS];
  251. struct regmap_irq_chip_data *irq_chip_data;
  252. struct power_supply *psy;
  253. struct mutex adc_lock;
  254. struct mutex attach_lock;
  255. struct mutex ichg_ieoc_lock;
  256. struct regulator_dev *rdev;
  257. struct completion aicl_done;
  258. enum power_supply_usb_type psy_usb_type;
  259. unsigned int old_stat;
  260. unsigned int vid;
  261. int ichg_ua;
  262. int ieoc_ua;
  263. };
  264. static int rt9467_otg_of_parse_cb(struct device_node *of,
  265. const struct regulator_desc *desc,
  266. struct regulator_config *cfg)
  267. {
  268. struct rt9467_chg_data *data = cfg->driver_data;
  269. cfg->ena_gpiod = fwnode_gpiod_get_index(of_fwnode_handle(of),
  270. "enable", 0, GPIOD_OUT_LOW |
  271. GPIOD_FLAGS_BIT_NONEXCLUSIVE,
  272. desc->name);
  273. if (IS_ERR(cfg->ena_gpiod)) {
  274. cfg->ena_gpiod = NULL;
  275. return 0;
  276. }
  277. return regmap_field_write(data->rm_field[F_OTG_PIN_EN], 1);
  278. }
  279. static const struct regulator_ops rt9467_otg_regulator_ops = {
  280. .enable = regulator_enable_regmap,
  281. .disable = regulator_disable_regmap,
  282. .is_enabled = regulator_is_enabled_regmap,
  283. .list_voltage = regulator_list_voltage_linear,
  284. .set_voltage_sel = regulator_set_voltage_sel_regmap,
  285. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  286. .set_current_limit = regulator_set_current_limit_regmap,
  287. .get_current_limit = regulator_get_current_limit_regmap,
  288. };
  289. static const u32 rt9467_otg_microamp[] = {
  290. 500000, 700000, 1100000, 1300000, 1800000, 2100000, 2400000, 3000000
  291. };
  292. static const struct regulator_desc rt9467_otg_desc = {
  293. .name = "rt9476-usb-otg-vbus",
  294. .of_match = "usb-otg-vbus-regulator",
  295. .of_parse_cb = rt9467_otg_of_parse_cb,
  296. .type = REGULATOR_VOLTAGE,
  297. .owner = THIS_MODULE,
  298. .min_uV = RT9467_OTG_MIN_uV,
  299. .uV_step = RT9467_OTG_STEP_uV,
  300. .n_voltages = RT9467_NUM_VOTG,
  301. .curr_table = rt9467_otg_microamp,
  302. .n_current_limits = ARRAY_SIZE(rt9467_otg_microamp),
  303. .csel_reg = RT9467_REG_CHG_CTRL10,
  304. .csel_mask = RT9467_MASK_OTG_CSEL,
  305. .vsel_reg = RT9467_REG_CHG_CTRL5,
  306. .vsel_mask = RT9467_MASK_OTG_VSEL,
  307. .enable_reg = RT9467_REG_CHG_CTRL1,
  308. .enable_mask = RT9467_MASK_OTG_EN,
  309. .ops = &rt9467_otg_regulator_ops,
  310. };
  311. static int rt9467_register_otg_regulator(struct rt9467_chg_data *data)
  312. {
  313. struct regulator_config cfg = {
  314. .dev = data->dev,
  315. .regmap = data->regmap,
  316. .driver_data = data,
  317. };
  318. data->rdev = devm_regulator_register(data->dev, &rt9467_otg_desc, &cfg);
  319. return PTR_ERR_OR_ZERO(data->rdev);
  320. }
  321. static int rt9467_get_value_from_ranges(struct rt9467_chg_data *data,
  322. enum rt9467_fields field,
  323. enum rt9467_ranges rsel,
  324. int *value)
  325. {
  326. const struct linear_range *range = rt9467_ranges + rsel;
  327. unsigned int sel;
  328. int ret;
  329. ret = regmap_field_read(data->rm_field[field], &sel);
  330. if (ret)
  331. return ret;
  332. return linear_range_get_value(range, sel, value);
  333. }
  334. static int rt9467_set_value_from_ranges(struct rt9467_chg_data *data,
  335. enum rt9467_fields field,
  336. enum rt9467_ranges rsel,
  337. int value)
  338. {
  339. const struct linear_range *range = rt9467_ranges + rsel;
  340. unsigned int sel;
  341. bool found;
  342. int ret;
  343. if (rsel == RT9467_RANGE_VMIVR) {
  344. ret = linear_range_get_selector_high(range, value, &sel, &found);
  345. if (ret)
  346. value = range->max_sel;
  347. } else {
  348. linear_range_get_selector_within(range, value, &sel);
  349. }
  350. return regmap_field_write(data->rm_field[field], sel);
  351. }
  352. static int rt9467_get_adc_sel(enum rt9467_adc_chan chan, int *sel)
  353. {
  354. switch (chan) {
  355. case RT9467_ADC_VBUS_DIV5:
  356. case RT9467_ADC_VBUS_DIV2:
  357. case RT9467_ADC_VSYS:
  358. case RT9467_ADC_VBAT:
  359. *sel = chan + 1;
  360. return 0;
  361. case RT9467_ADC_TS_BAT:
  362. *sel = chan + 2;
  363. return 0;
  364. case RT9467_ADC_IBUS:
  365. case RT9467_ADC_IBAT:
  366. *sel = chan + 3;
  367. return 0;
  368. case RT9467_ADC_REGN:
  369. case RT9467_ADC_TEMP_JC:
  370. *sel = chan + 4;
  371. return 0;
  372. default:
  373. return -EINVAL;
  374. }
  375. }
  376. static int rt9467_get_adc_raw_data(struct rt9467_chg_data *data,
  377. enum rt9467_adc_chan chan, int *val)
  378. {
  379. unsigned int adc_stat, reg_val, adc_sel;
  380. __be16 chan_raw_data;
  381. int ret;
  382. mutex_lock(&data->adc_lock);
  383. ret = rt9467_get_adc_sel(chan, &adc_sel);
  384. if (ret)
  385. goto adc_unlock;
  386. ret = regmap_write(data->regmap, RT9467_REG_CHG_ADC, 0);
  387. if (ret) {
  388. dev_err(data->dev, "Failed to clear ADC enable\n");
  389. goto adc_unlock;
  390. }
  391. reg_val = RT9467_MASK_ADC_START | FIELD_PREP(RT9467_MASK_ADC_IN_SEL, adc_sel);
  392. ret = regmap_write(data->regmap, RT9467_REG_CHG_ADC, reg_val);
  393. if (ret)
  394. goto adc_unlock;
  395. /* Minimum wait time for one channel processing */
  396. msleep(RT9467_ADCCONV_TIME_MS);
  397. ret = regmap_read_poll_timeout(data->regmap, RT9467_REG_CHG_ADC,
  398. adc_stat,
  399. !(adc_stat & RT9467_MASK_ADC_START),
  400. MILLI, RT9467_ADCCONV_TIME_MS * MILLI);
  401. if (ret) {
  402. dev_err(data->dev, "Failed to wait ADC conversion, chan = %d\n", chan);
  403. goto adc_unlock;
  404. }
  405. ret = regmap_raw_read(data->regmap, RT9467_REG_ADC_DATA_H,
  406. &chan_raw_data, sizeof(chan_raw_data));
  407. if (ret)
  408. goto adc_unlock;
  409. *val = be16_to_cpu(chan_raw_data);
  410. adc_unlock:
  411. mutex_unlock(&data->adc_lock);
  412. return ret;
  413. }
  414. static int rt9467_get_adc(struct rt9467_chg_data *data,
  415. enum rt9467_adc_chan chan, int *val)
  416. {
  417. unsigned int aicr_ua, ichg_ua;
  418. int ret;
  419. ret = rt9467_get_adc_raw_data(data, chan, val);
  420. if (ret)
  421. return ret;
  422. switch (chan) {
  423. case RT9467_ADC_VBUS_DIV5:
  424. *val *= 25000;
  425. return 0;
  426. case RT9467_ADC_VBUS_DIV2:
  427. *val *= 10000;
  428. return 0;
  429. case RT9467_ADC_VBAT:
  430. case RT9467_ADC_VSYS:
  431. case RT9467_ADC_REGN:
  432. *val *= 5000;
  433. return 0;
  434. case RT9467_ADC_TS_BAT:
  435. *val /= 400;
  436. return 0;
  437. case RT9467_ADC_IBUS:
  438. /* UUG MOS turn-on ratio will affect the IBUS adc scale */
  439. ret = rt9467_get_value_from_ranges(data, F_IAICR,
  440. RT9467_RANGE_IAICR, &aicr_ua);
  441. if (ret)
  442. return ret;
  443. *val *= aicr_ua < 400000 ? 29480 : 50000;
  444. return 0;
  445. case RT9467_ADC_IBAT:
  446. /* PP MOS turn-on ratio will affect the ICHG adc scale */
  447. ret = rt9467_get_value_from_ranges(data, F_ICHG,
  448. RT9467_RANGE_ICHG, &ichg_ua);
  449. if (ret)
  450. return ret;
  451. *val *= ichg_ua <= 400000 ? 28500 :
  452. ichg_ua <= 800000 ? 31500 : 500000;
  453. return 0;
  454. case RT9467_ADC_TEMP_JC:
  455. *val = ((*val * 2) - 40) * 10;
  456. return 0;
  457. default:
  458. return -EINVAL;
  459. }
  460. }
  461. static int rt9467_psy_get_status(struct rt9467_chg_data *data, int *state)
  462. {
  463. unsigned int status;
  464. int ret;
  465. ret = regmap_field_read(data->rm_field[F_CHG_STAT], &status);
  466. if (ret)
  467. return ret;
  468. switch (status) {
  469. case RT9467_STAT_READY:
  470. *state = POWER_SUPPLY_STATUS_NOT_CHARGING;
  471. return 0;
  472. case RT9467_STAT_PROGRESS:
  473. *state = POWER_SUPPLY_STATUS_CHARGING;
  474. return 0;
  475. case RT9467_STAT_CHARGE_DONE:
  476. *state = POWER_SUPPLY_STATUS_FULL;
  477. return 0;
  478. default:
  479. *state = POWER_SUPPLY_STATUS_UNKNOWN;
  480. return 0;
  481. }
  482. }
  483. static int rt9467_psy_set_ichg(struct rt9467_chg_data *data, int microamp)
  484. {
  485. int ret;
  486. mutex_lock(&data->ichg_ieoc_lock);
  487. if (microamp < 500000) {
  488. dev_err(data->dev, "Minimum value must be 500mA\n");
  489. microamp = 500000;
  490. }
  491. ret = rt9467_set_value_from_ranges(data, F_ICHG, RT9467_RANGE_ICHG, microamp);
  492. if (ret)
  493. goto out;
  494. ret = rt9467_get_value_from_ranges(data, F_ICHG, RT9467_RANGE_ICHG,
  495. &data->ichg_ua);
  496. if (ret)
  497. goto out;
  498. out:
  499. mutex_unlock(&data->ichg_ieoc_lock);
  500. return ret;
  501. }
  502. static int rt9467_run_aicl(struct rt9467_chg_data *data)
  503. {
  504. unsigned int statc, aicl_vth;
  505. int mivr_vth, aicr_get;
  506. int ret = 0;
  507. ret = regmap_read(data->regmap, RT9467_REG_CHG_STATC, &statc);
  508. if (ret) {
  509. dev_err(data->dev, "Failed to read status\n");
  510. return ret;
  511. }
  512. if (!(statc & RT9467_MASK_PWR_RDY) || !(statc & RT9467_MASK_MIVR_STAT)) {
  513. dev_info(data->dev, "Condition not matched %d\n", statc);
  514. return 0;
  515. }
  516. ret = rt9467_get_value_from_ranges(data, F_VMIVR, RT9467_RANGE_VMIVR,
  517. &mivr_vth);
  518. if (ret) {
  519. dev_err(data->dev, "Failed to get mivr\n");
  520. return ret;
  521. }
  522. /* AICL_VTH = MIVR_VTH + 200mV */
  523. aicl_vth = mivr_vth + RT9467_AICLVTH_GAP_uV;
  524. ret = rt9467_set_value_from_ranges(data, F_AICL_VTH,
  525. RT9467_RANGE_AICL_VTH, aicl_vth);
  526. /* Trigger AICL function */
  527. ret = regmap_field_write(data->rm_field[F_AICL_MEAS], 1);
  528. if (ret) {
  529. dev_err(data->dev, "Failed to set aicl measurement\n");
  530. return ret;
  531. }
  532. reinit_completion(&data->aicl_done);
  533. ret = wait_for_completion_timeout(&data->aicl_done, msecs_to_jiffies(3500));
  534. if (ret == 0)
  535. return -ETIMEDOUT;
  536. ret = rt9467_get_value_from_ranges(data, F_IAICR, RT9467_RANGE_IAICR, &aicr_get);
  537. if (ret) {
  538. dev_err(data->dev, "Failed to get aicr\n");
  539. return ret;
  540. }
  541. dev_info(data->dev, "aicr get = %d uA\n", aicr_get);
  542. return 0;
  543. }
  544. static int rt9467_psy_set_ieoc(struct rt9467_chg_data *data, int microamp)
  545. {
  546. int ret;
  547. mutex_lock(&data->ichg_ieoc_lock);
  548. ret = rt9467_set_value_from_ranges(data, F_IEOC, RT9467_RANGE_IEOC, microamp);
  549. if (ret)
  550. goto out;
  551. ret = rt9467_get_value_from_ranges(data, F_IEOC, RT9467_RANGE_IEOC, &data->ieoc_ua);
  552. if (ret)
  553. goto out;
  554. out:
  555. mutex_unlock(&data->ichg_ieoc_lock);
  556. return ret;
  557. }
  558. static const enum power_supply_property rt9467_chg_properties[] = {
  559. POWER_SUPPLY_PROP_STATUS,
  560. POWER_SUPPLY_PROP_ONLINE,
  561. POWER_SUPPLY_PROP_CURRENT_MAX,
  562. POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,
  563. POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX,
  564. POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE,
  565. POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX,
  566. POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
  567. POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT,
  568. POWER_SUPPLY_PROP_USB_TYPE,
  569. POWER_SUPPLY_PROP_PRECHARGE_CURRENT,
  570. POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT,
  571. };
  572. static int rt9467_psy_get_property(struct power_supply *psy,
  573. enum power_supply_property psp,
  574. union power_supply_propval *val)
  575. {
  576. struct rt9467_chg_data *data = power_supply_get_drvdata(psy);
  577. switch (psp) {
  578. case POWER_SUPPLY_PROP_STATUS:
  579. return rt9467_psy_get_status(data, &val->intval);
  580. case POWER_SUPPLY_PROP_ONLINE:
  581. return regmap_field_read(data->rm_field[F_PWR_RDY], &val->intval);
  582. case POWER_SUPPLY_PROP_CURRENT_MAX:
  583. mutex_lock(&data->attach_lock);
  584. if (data->psy_usb_type == POWER_SUPPLY_USB_TYPE_UNKNOWN ||
  585. data->psy_usb_type == POWER_SUPPLY_USB_TYPE_SDP)
  586. val->intval = 500000;
  587. else
  588. val->intval = 1500000;
  589. mutex_unlock(&data->attach_lock);
  590. return 0;
  591. case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
  592. mutex_lock(&data->ichg_ieoc_lock);
  593. val->intval = data->ichg_ua;
  594. mutex_unlock(&data->ichg_ieoc_lock);
  595. return 0;
  596. case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX:
  597. val->intval = RT9467_ICHG_MAX_uA;
  598. return 0;
  599. case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
  600. return rt9467_get_value_from_ranges(data, F_VOREG,
  601. RT9467_RANGE_VOREG,
  602. &val->intval);
  603. case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX:
  604. val->intval = RT9467_CV_MAX_uV;
  605. return 0;
  606. case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
  607. return rt9467_get_value_from_ranges(data, F_IAICR,
  608. RT9467_RANGE_IAICR,
  609. &val->intval);
  610. case POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT:
  611. return rt9467_get_value_from_ranges(data, F_VMIVR,
  612. RT9467_RANGE_VMIVR,
  613. &val->intval);
  614. case POWER_SUPPLY_PROP_USB_TYPE:
  615. mutex_lock(&data->attach_lock);
  616. val->intval = data->psy_usb_type;
  617. mutex_unlock(&data->attach_lock);
  618. return 0;
  619. case POWER_SUPPLY_PROP_PRECHARGE_CURRENT:
  620. return rt9467_get_value_from_ranges(data, F_IPREC,
  621. RT9467_RANGE_IPREC,
  622. &val->intval);
  623. case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT:
  624. mutex_lock(&data->ichg_ieoc_lock);
  625. val->intval = data->ieoc_ua;
  626. mutex_unlock(&data->ichg_ieoc_lock);
  627. return 0;
  628. default:
  629. return -ENODATA;
  630. }
  631. }
  632. static int rt9467_psy_set_property(struct power_supply *psy,
  633. enum power_supply_property psp,
  634. const union power_supply_propval *val)
  635. {
  636. struct rt9467_chg_data *data = power_supply_get_drvdata(psy);
  637. switch (psp) {
  638. case POWER_SUPPLY_PROP_STATUS:
  639. return regmap_field_write(data->rm_field[F_CHG_EN], val->intval);
  640. case POWER_SUPPLY_PROP_ONLINE:
  641. return regmap_field_write(data->rm_field[F_HZ], val->intval);
  642. case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
  643. return rt9467_psy_set_ichg(data, val->intval);
  644. case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
  645. return rt9467_set_value_from_ranges(data, F_VOREG,
  646. RT9467_RANGE_VOREG, val->intval);
  647. case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
  648. if (val->intval == -1)
  649. return rt9467_run_aicl(data);
  650. else
  651. return rt9467_set_value_from_ranges(data, F_IAICR,
  652. RT9467_RANGE_IAICR,
  653. val->intval);
  654. case POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT:
  655. return rt9467_set_value_from_ranges(data, F_VMIVR,
  656. RT9467_RANGE_VMIVR, val->intval);
  657. case POWER_SUPPLY_PROP_PRECHARGE_CURRENT:
  658. return rt9467_set_value_from_ranges(data, F_IPREC,
  659. RT9467_RANGE_IPREC, val->intval);
  660. case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT:
  661. return rt9467_psy_set_ieoc(data, val->intval);
  662. default:
  663. return -EINVAL;
  664. }
  665. }
  666. static int rt9467_chg_prop_is_writeable(struct power_supply *psy,
  667. enum power_supply_property psp)
  668. {
  669. switch (psp) {
  670. case POWER_SUPPLY_PROP_STATUS:
  671. case POWER_SUPPLY_PROP_ONLINE:
  672. case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
  673. case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
  674. case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
  675. case POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT:
  676. case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT:
  677. case POWER_SUPPLY_PROP_PRECHARGE_CURRENT:
  678. return 1;
  679. default:
  680. return 0;
  681. }
  682. }
  683. static const struct power_supply_desc rt9467_chg_psy_desc = {
  684. .name = "rt9467-charger",
  685. .type = POWER_SUPPLY_TYPE_USB,
  686. .usb_types = BIT(POWER_SUPPLY_USB_TYPE_SDP) |
  687. BIT(POWER_SUPPLY_USB_TYPE_CDP) |
  688. BIT(POWER_SUPPLY_USB_TYPE_DCP) |
  689. BIT(POWER_SUPPLY_USB_TYPE_UNKNOWN),
  690. .properties = rt9467_chg_properties,
  691. .num_properties = ARRAY_SIZE(rt9467_chg_properties),
  692. .property_is_writeable = rt9467_chg_prop_is_writeable,
  693. .get_property = rt9467_psy_get_property,
  694. .set_property = rt9467_psy_set_property,
  695. };
  696. static inline struct rt9467_chg_data *psy_device_to_chip(struct device *dev)
  697. {
  698. return power_supply_get_drvdata(to_power_supply(dev));
  699. }
  700. static ssize_t sysoff_enable_show(struct device *dev,
  701. struct device_attribute *attr, char *buf)
  702. {
  703. struct rt9467_chg_data *data = psy_device_to_chip(dev);
  704. unsigned int sysoff_enable;
  705. int ret;
  706. ret = regmap_field_read(data->rm_field[F_SHIP_MODE], &sysoff_enable);
  707. if (ret)
  708. return ret;
  709. return sysfs_emit(buf, "%d\n", sysoff_enable);
  710. }
  711. static ssize_t sysoff_enable_store(struct device *dev,
  712. struct device_attribute *attr,
  713. const char *buf, size_t count)
  714. {
  715. struct rt9467_chg_data *data = psy_device_to_chip(dev);
  716. unsigned int tmp;
  717. int ret;
  718. ret = kstrtouint(buf, 10, &tmp);
  719. if (ret)
  720. return ret;
  721. ret = regmap_field_write(data->rm_field[F_SHIP_MODE], !!tmp);
  722. if (ret)
  723. return ret;
  724. return count;
  725. }
  726. static DEVICE_ATTR_RW(sysoff_enable);
  727. static struct attribute *rt9467_sysfs_attrs[] = {
  728. &dev_attr_sysoff_enable.attr,
  729. NULL
  730. };
  731. ATTRIBUTE_GROUPS(rt9467_sysfs);
  732. static int rt9467_register_psy(struct rt9467_chg_data *data)
  733. {
  734. struct power_supply_config cfg = {
  735. .drv_data = data,
  736. .of_node = dev_of_node(data->dev),
  737. .attr_grp = rt9467_sysfs_groups,
  738. };
  739. data->psy = devm_power_supply_register(data->dev, &rt9467_chg_psy_desc,
  740. &cfg);
  741. return PTR_ERR_OR_ZERO(data->psy);
  742. }
  743. static int rt9467_mivr_handler(struct rt9467_chg_data *data)
  744. {
  745. unsigned int mivr_act;
  746. int ret, ibus_ma;
  747. /*
  748. * back-boost workaround
  749. * If (mivr_active & ibus < 100mA), toggle cfo bit
  750. */
  751. ret = regmap_field_read(data->rm_field[F_CHG_MIVR], &mivr_act);
  752. if (ret) {
  753. dev_err(data->dev, "Failed to read MIVR stat\n");
  754. return ret;
  755. }
  756. if (!mivr_act)
  757. return 0;
  758. ret = rt9467_get_adc(data, RT9467_ADC_IBUS, &ibus_ma);
  759. if (ret) {
  760. dev_err(data->dev, "Failed to get IBUS\n");
  761. return ret;
  762. }
  763. if (ibus_ma < 100000) {
  764. ret = regmap_field_write(data->rm_field[F_CFO_EN], 0);
  765. ret |= regmap_field_write(data->rm_field[F_CFO_EN], 1);
  766. if (ret)
  767. dev_err(data->dev, "Failed to toggle cfo\n");
  768. }
  769. return ret;
  770. }
  771. static irqreturn_t rt9467_statc_handler(int irq, void *priv)
  772. {
  773. struct rt9467_chg_data *data = priv;
  774. unsigned int new_stat, evts = 0;
  775. int ret;
  776. ret = regmap_read(data->regmap, RT9467_REG_CHG_STATC, &new_stat);
  777. if (ret) {
  778. dev_err(data->dev, "Failed to read chg_statc\n");
  779. return IRQ_NONE;
  780. }
  781. evts = data->old_stat ^ new_stat;
  782. data->old_stat = new_stat;
  783. if ((evts & new_stat) & RT9467_MASK_MIVR_STAT) {
  784. ret = rt9467_mivr_handler(data);
  785. if (ret)
  786. dev_err(data->dev, "Failed to handle mivr stat\n");
  787. }
  788. return IRQ_HANDLED;
  789. }
  790. static irqreturn_t rt9467_wdt_handler(int irq, void *priv)
  791. {
  792. struct rt9467_chg_data *data = priv;
  793. unsigned int dev_id;
  794. int ret;
  795. /* Any i2c communication can kick watchdog timer */
  796. ret = regmap_read(data->regmap, RT9467_REG_DEVICE_ID, &dev_id);
  797. if (ret) {
  798. dev_err(data->dev, "Failed to kick wdt (%d)\n", ret);
  799. return IRQ_NONE;
  800. }
  801. return IRQ_HANDLED;
  802. }
  803. static int rt9467_report_usb_state(struct rt9467_chg_data *data)
  804. {
  805. unsigned int usb_stat, power_ready;
  806. bool psy_changed = true;
  807. int ret;
  808. ret = regmap_field_read(data->rm_field[F_USB_STATUS], &usb_stat);
  809. ret |= regmap_field_read(data->rm_field[F_PWR_RDY], &power_ready);
  810. if (ret)
  811. return ret;
  812. if (!power_ready)
  813. usb_stat = RT9467_CHG_TYPE_NOVBUS;
  814. mutex_lock(&data->attach_lock);
  815. switch (usb_stat) {
  816. case RT9467_CHG_TYPE_NOVBUS:
  817. data->psy_usb_type = POWER_SUPPLY_USB_TYPE_UNKNOWN;
  818. break;
  819. case RT9467_CHG_TYPE_SDP:
  820. data->psy_usb_type = POWER_SUPPLY_USB_TYPE_SDP;
  821. break;
  822. case RT9467_CHG_TYPE_SDPNSTD:
  823. data->psy_usb_type = POWER_SUPPLY_USB_TYPE_DCP;
  824. break;
  825. case RT9467_CHG_TYPE_DCP:
  826. data->psy_usb_type = POWER_SUPPLY_USB_TYPE_DCP;
  827. break;
  828. case RT9467_CHG_TYPE_CDP:
  829. data->psy_usb_type = POWER_SUPPLY_USB_TYPE_CDP;
  830. break;
  831. case RT9467_CHG_TYPE_UNDER_GOING:
  832. default:
  833. psy_changed = false;
  834. break;
  835. }
  836. mutex_unlock(&data->attach_lock);
  837. if (psy_changed)
  838. power_supply_changed(data->psy);
  839. return 0;
  840. }
  841. static irqreturn_t rt9467_usb_state_handler(int irq, void *priv)
  842. {
  843. struct rt9467_chg_data *data = priv;
  844. int ret;
  845. ret = rt9467_report_usb_state(data);
  846. if (ret) {
  847. dev_err(data->dev, "Failed to report attach type (%d)\n", ret);
  848. return IRQ_NONE;
  849. }
  850. return IRQ_HANDLED;
  851. }
  852. static irqreturn_t rt9467_aiclmeas_handler(int irq, void *priv)
  853. {
  854. struct rt9467_chg_data *data = priv;
  855. complete(&data->aicl_done);
  856. return IRQ_HANDLED;
  857. }
  858. #define RT9467_IRQ_DESC(_name, _handler_func, _hwirq) \
  859. { \
  860. .name = #_name, \
  861. .handler = rt9467_##_handler_func##_handler, \
  862. .hwirq = _hwirq, \
  863. }
  864. static int rt9467_request_interrupt(struct rt9467_chg_data *data)
  865. {
  866. struct device *dev = data->dev;
  867. static const struct {
  868. const char *name;
  869. int hwirq;
  870. irq_handler_t handler;
  871. } rt9467_exclusive_irqs[] = {
  872. RT9467_IRQ_DESC(statc, statc, RT9467_IRQ_TS_STATC),
  873. RT9467_IRQ_DESC(wdt, wdt, RT9467_IRQ_WDTMR),
  874. RT9467_IRQ_DESC(attach, usb_state, RT9467_IRQ_ATTACH),
  875. RT9467_IRQ_DESC(detach, usb_state, RT9467_IRQ_DETACH),
  876. RT9467_IRQ_DESC(aiclmeas, aiclmeas, RT9467_IRQ_CHG_AICLM),
  877. }, rt9466_exclusive_irqs[] = {
  878. RT9467_IRQ_DESC(statc, statc, RT9467_IRQ_TS_STATC),
  879. RT9467_IRQ_DESC(wdt, wdt, RT9467_IRQ_WDTMR),
  880. RT9467_IRQ_DESC(aiclmeas, aiclmeas, RT9467_IRQ_CHG_AICLM),
  881. }, *chg_irqs;
  882. int num_chg_irqs, i, virq, ret;
  883. if (data->vid == RT9466_VID) {
  884. chg_irqs = rt9466_exclusive_irqs;
  885. num_chg_irqs = ARRAY_SIZE(rt9466_exclusive_irqs);
  886. } else {
  887. chg_irqs = rt9467_exclusive_irqs;
  888. num_chg_irqs = ARRAY_SIZE(rt9467_exclusive_irqs);
  889. }
  890. for (i = 0; i < num_chg_irqs; i++) {
  891. virq = regmap_irq_get_virq(data->irq_chip_data, chg_irqs[i].hwirq);
  892. if (virq <= 0)
  893. return dev_err_probe(dev, -EINVAL, "Failed to get (%s) irq\n",
  894. chg_irqs[i].name);
  895. ret = devm_request_threaded_irq(dev, virq, NULL, chg_irqs[i].handler,
  896. IRQF_ONESHOT, chg_irqs[i].name, data);
  897. if (ret)
  898. return dev_err_probe(dev, ret, "Failed to request (%s) irq\n",
  899. chg_irqs[i].name);
  900. }
  901. return 0;
  902. }
  903. static int rt9467_do_charger_init(struct rt9467_chg_data *data)
  904. {
  905. struct device *dev = data->dev;
  906. int ret;
  907. ret = regmap_write(data->regmap, RT9467_REG_CHG_ADC, 0);
  908. if (ret)
  909. return dev_err_probe(dev, ret, "Failed to reset ADC\n");
  910. ret = rt9467_get_value_from_ranges(data, F_ICHG, RT9467_RANGE_ICHG,
  911. &data->ichg_ua);
  912. ret |= rt9467_get_value_from_ranges(data, F_IEOC, RT9467_RANGE_IEOC,
  913. &data->ieoc_ua);
  914. if (ret)
  915. return dev_err_probe(dev, ret, "Failed to init ichg/ieoc value\n");
  916. ret = regmap_update_bits(data->regmap, RT9467_REG_CHG_STATC_CTRL,
  917. RT9467_MASK_PWR_RDY | RT9467_MASK_MIVR_STAT, 0);
  918. if (ret)
  919. return dev_err_probe(dev, ret, "Failed to make statc unmask\n");
  920. /* Select IINLMTSEL to use AICR */
  921. ret = regmap_field_write(data->rm_field[F_IINLMTSEL],
  922. RT9467_IINLMTSEL_AICR);
  923. if (ret)
  924. return dev_err_probe(dev, ret, "Failed to set iinlmtsel to AICR\n");
  925. /* Wait for AICR Rampping */
  926. msleep(150);
  927. /* Disable hardware ILIM */
  928. ret = regmap_field_write(data->rm_field[F_ILIM_EN], 0);
  929. if (ret)
  930. return dev_err_probe(dev, ret, "Failed to disable hardware ILIM\n");
  931. /* Set inductor OCP to high level */
  932. ret = regmap_field_write(data->rm_field[F_OCP], 1);
  933. if (ret)
  934. return dev_err_probe(dev, ret, "Failed to set higher inductor OCP level\n");
  935. /* Set charge termination default enable */
  936. ret = regmap_field_write(data->rm_field[F_TE], 1);
  937. if (ret)
  938. return dev_err_probe(dev, ret, "Failed to set TE=1\n");
  939. /* Set 12hrs fast charger timer */
  940. ret = regmap_field_write(data->rm_field[F_WT_FC], 4);
  941. if (ret)
  942. return dev_err_probe(dev, ret, "Failed to set WT_FC\n");
  943. /* Toggle BC12 function */
  944. ret = regmap_field_write(data->rm_field[F_USBCHGEN], 0);
  945. if (ret)
  946. return dev_err_probe(dev, ret, "Failed to disable BC12\n");
  947. return regmap_field_write(data->rm_field[F_USBCHGEN], 1);
  948. }
  949. static bool rt9467_is_accessible_reg(struct device *dev, unsigned int reg)
  950. {
  951. switch (reg) {
  952. case 0x00 ... 0x1A:
  953. case 0x20 ... 0x38:
  954. case 0x40 ... 0x49:
  955. case 0x50 ... 0x57:
  956. case 0x60 ... 0x67:
  957. case 0x70 ... 0x79:
  958. case 0x82 ... 0x85:
  959. return true;
  960. default:
  961. return false;
  962. }
  963. }
  964. static const struct regmap_config rt9467_regmap_config = {
  965. .reg_bits = 8,
  966. .val_bits = 8,
  967. .max_register = 0x85,
  968. .writeable_reg = rt9467_is_accessible_reg,
  969. .readable_reg = rt9467_is_accessible_reg,
  970. };
  971. static int rt9467_check_vendor_info(struct rt9467_chg_data *data)
  972. {
  973. unsigned int vid;
  974. int ret;
  975. ret = regmap_field_read(data->rm_field[F_VENDOR], &vid);
  976. if (ret) {
  977. dev_err(data->dev, "Failed to get vid\n");
  978. return ret;
  979. }
  980. if ((vid != RT9466_VID) && (vid != RT9467_VID))
  981. return dev_err_probe(data->dev, -ENODEV,
  982. "VID not correct [0x%02X]\n", vid);
  983. data->vid = vid;
  984. return 0;
  985. }
  986. static int rt9467_reset_chip(struct rt9467_chg_data *data)
  987. {
  988. int ret;
  989. /* Disable HZ before reset chip */
  990. ret = regmap_field_write(data->rm_field[F_HZ], 0);
  991. if (ret)
  992. return ret;
  993. return regmap_field_write(data->rm_field[F_RST], 1);
  994. }
  995. static void rt9467_chg_destroy_adc_lock(void *data)
  996. {
  997. struct mutex *adc_lock = data;
  998. mutex_destroy(adc_lock);
  999. }
  1000. static void rt9467_chg_destroy_attach_lock(void *data)
  1001. {
  1002. struct mutex *attach_lock = data;
  1003. mutex_destroy(attach_lock);
  1004. }
  1005. static void rt9467_chg_destroy_ichg_ieoc_lock(void *data)
  1006. {
  1007. struct mutex *ichg_ieoc_lock = data;
  1008. mutex_destroy(ichg_ieoc_lock);
  1009. }
  1010. static void rt9467_chg_complete_aicl_done(void *data)
  1011. {
  1012. struct completion *aicl_done = data;
  1013. complete(aicl_done);
  1014. }
  1015. static int rt9467_charger_probe(struct i2c_client *i2c)
  1016. {
  1017. struct device *dev = &i2c->dev;
  1018. struct rt9467_chg_data *data;
  1019. struct gpio_desc *ceb_gpio;
  1020. int ret;
  1021. data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
  1022. if (!data)
  1023. return -ENOMEM;
  1024. data->dev = &i2c->dev;
  1025. i2c_set_clientdata(i2c, data);
  1026. /* Default pull charge enable gpio to make 'CHG_EN' by SW control only */
  1027. ceb_gpio = devm_gpiod_get_optional(dev, "charge-enable", GPIOD_OUT_HIGH);
  1028. if (IS_ERR(ceb_gpio))
  1029. return dev_err_probe(dev, PTR_ERR(ceb_gpio),
  1030. "Failed to config charge enable gpio\n");
  1031. data->regmap = devm_regmap_init_i2c(i2c, &rt9467_regmap_config);
  1032. if (IS_ERR(data->regmap))
  1033. return dev_err_probe(dev, PTR_ERR(data->regmap),
  1034. "Failed to init regmap\n");
  1035. ret = devm_regmap_field_bulk_alloc(dev, data->regmap,
  1036. data->rm_field, rt9467_chg_fields,
  1037. ARRAY_SIZE(rt9467_chg_fields));
  1038. if (ret)
  1039. return dev_err_probe(dev, ret, "Failed to alloc regmap fields\n");
  1040. ret = rt9467_check_vendor_info(data);
  1041. if (ret)
  1042. return dev_err_probe(dev, ret, "Failed to check vendor info");
  1043. ret = rt9467_reset_chip(data);
  1044. if (ret)
  1045. return dev_err_probe(dev, ret, "Failed to reset chip\n");
  1046. ret = devm_regmap_add_irq_chip(dev, data->regmap, i2c->irq,
  1047. IRQF_TRIGGER_LOW | IRQF_ONESHOT, 0,
  1048. &rt9467_irq_chip, &data->irq_chip_data);
  1049. if (ret)
  1050. return dev_err_probe(dev, ret, "Failed to add irq chip\n");
  1051. mutex_init(&data->adc_lock);
  1052. ret = devm_add_action_or_reset(dev, rt9467_chg_destroy_adc_lock,
  1053. &data->adc_lock);
  1054. if (ret)
  1055. return dev_err_probe(dev, ret, "Failed to init ADC lock\n");
  1056. mutex_init(&data->attach_lock);
  1057. ret = devm_add_action_or_reset(dev, rt9467_chg_destroy_attach_lock,
  1058. &data->attach_lock);
  1059. if (ret)
  1060. return dev_err_probe(dev, ret, "Failed to init attach lock\n");
  1061. mutex_init(&data->ichg_ieoc_lock);
  1062. ret = devm_add_action_or_reset(dev, rt9467_chg_destroy_ichg_ieoc_lock,
  1063. &data->ichg_ieoc_lock);
  1064. if (ret)
  1065. return dev_err_probe(dev, ret, "Failed to init ICHG/IEOC lock\n");
  1066. init_completion(&data->aicl_done);
  1067. ret = devm_add_action_or_reset(dev, rt9467_chg_complete_aicl_done,
  1068. &data->aicl_done);
  1069. if (ret)
  1070. return dev_err_probe(dev, ret, "Failed to init AICL done completion\n");
  1071. ret = rt9467_do_charger_init(data);
  1072. if (ret)
  1073. return ret;
  1074. ret = rt9467_register_otg_regulator(data);
  1075. if (ret)
  1076. return ret;
  1077. ret = rt9467_register_psy(data);
  1078. if (ret)
  1079. return ret;
  1080. return rt9467_request_interrupt(data);
  1081. }
  1082. static const struct of_device_id rt9467_charger_of_match_table[] = {
  1083. { .compatible = "richtek,rt9467", },
  1084. {}
  1085. };
  1086. MODULE_DEVICE_TABLE(of, rt9467_charger_of_match_table);
  1087. static struct i2c_driver rt9467_charger_driver = {
  1088. .driver = {
  1089. .name = "rt9467-charger",
  1090. .of_match_table = rt9467_charger_of_match_table,
  1091. },
  1092. .probe = rt9467_charger_probe,
  1093. };
  1094. module_i2c_driver(rt9467_charger_driver);
  1095. MODULE_DESCRIPTION("Richtek RT9467 Charger Driver");
  1096. MODULE_AUTHOR("ChiYuan Huang <cy_huang@richtek.com>");
  1097. MODULE_AUTHOR("ChiaEn Wu <chiaen_wu@richtek.com>");
  1098. MODULE_LICENSE("GPL");