xref: /OK3568_Linux_fs/kernel/drivers/power/supply/rt9455_charger.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Driver for Richtek RT9455WSC battery charger.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2015 Intel Corporation
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #include <linux/module.h>
9*4882a593Smuzhiyun #include <linux/interrupt.h>
10*4882a593Smuzhiyun #include <linux/delay.h>
11*4882a593Smuzhiyun #include <linux/of_irq.h>
12*4882a593Smuzhiyun #include <linux/of_device.h>
13*4882a593Smuzhiyun #include <linux/pm_runtime.h>
14*4882a593Smuzhiyun #include <linux/power_supply.h>
15*4882a593Smuzhiyun #include <linux/i2c.h>
16*4882a593Smuzhiyun #include <linux/acpi.h>
17*4882a593Smuzhiyun #include <linux/usb/phy.h>
18*4882a593Smuzhiyun #include <linux/regmap.h>
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #define RT9455_MANUFACTURER			"Richtek"
21*4882a593Smuzhiyun #define RT9455_MODEL_NAME			"RT9455"
22*4882a593Smuzhiyun #define RT9455_DRIVER_NAME			"rt9455-charger"
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #define RT9455_IRQ_NAME				"interrupt"
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun #define RT9455_PWR_RDY_DELAY			1 /* 1 second */
27*4882a593Smuzhiyun #define RT9455_MAX_CHARGING_TIME		21600 /* 6 hrs */
28*4882a593Smuzhiyun #define RT9455_BATT_PRESENCE_DELAY		60 /* 60 seconds */
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun #define RT9455_CHARGE_MODE			0x00
31*4882a593Smuzhiyun #define RT9455_BOOST_MODE			0x01
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun #define RT9455_FAULT				0x03
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun #define RT9455_IAICR_100MA			0x00
36*4882a593Smuzhiyun #define RT9455_IAICR_500MA			0x01
37*4882a593Smuzhiyun #define RT9455_IAICR_NO_LIMIT			0x03
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun #define RT9455_CHARGE_DISABLE			0x00
40*4882a593Smuzhiyun #define RT9455_CHARGE_ENABLE			0x01
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun #define RT9455_PWR_FAULT			0x00
43*4882a593Smuzhiyun #define RT9455_PWR_GOOD				0x01
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun #define RT9455_REG_CTRL1			0x00 /* CTRL1 reg address */
46*4882a593Smuzhiyun #define RT9455_REG_CTRL2			0x01 /* CTRL2 reg address */
47*4882a593Smuzhiyun #define RT9455_REG_CTRL3			0x02 /* CTRL3 reg address */
48*4882a593Smuzhiyun #define RT9455_REG_DEV_ID			0x03 /* DEV_ID reg address */
49*4882a593Smuzhiyun #define RT9455_REG_CTRL4			0x04 /* CTRL4 reg address */
50*4882a593Smuzhiyun #define RT9455_REG_CTRL5			0x05 /* CTRL5 reg address */
51*4882a593Smuzhiyun #define RT9455_REG_CTRL6			0x06 /* CTRL6 reg address */
52*4882a593Smuzhiyun #define RT9455_REG_CTRL7			0x07 /* CTRL7 reg address */
53*4882a593Smuzhiyun #define RT9455_REG_IRQ1				0x08 /* IRQ1 reg address */
54*4882a593Smuzhiyun #define RT9455_REG_IRQ2				0x09 /* IRQ2 reg address */
55*4882a593Smuzhiyun #define RT9455_REG_IRQ3				0x0A /* IRQ3 reg address */
56*4882a593Smuzhiyun #define RT9455_REG_MASK1			0x0B /* MASK1 reg address */
57*4882a593Smuzhiyun #define RT9455_REG_MASK2			0x0C /* MASK2 reg address */
58*4882a593Smuzhiyun #define RT9455_REG_MASK3			0x0D /* MASK3 reg address */
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun enum rt9455_fields {
61*4882a593Smuzhiyun 	F_STAT, F_BOOST, F_PWR_RDY, F_OTG_PIN_POLARITY, /* CTRL1 reg fields */
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun 	F_IAICR, F_TE_SHDN_EN, F_HIGHER_OCP, F_TE, F_IAICR_INT, F_HIZ,
64*4882a593Smuzhiyun 	F_OPA_MODE, /* CTRL2 reg fields */
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun 	F_VOREG, F_OTG_PL, F_OTG_EN, /* CTRL3 reg fields */
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun 	F_VENDOR_ID, F_CHIP_REV, /* DEV_ID reg fields */
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun 	F_RST, /* CTRL4 reg fields */
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun 	F_TMR_EN, F_MIVR, F_IPREC, F_IEOC_PERCENTAGE, /* CTRL5 reg fields*/
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun 	F_IAICR_SEL, F_ICHRG, F_VPREC, /* CTRL6 reg fields */
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun 	F_BATD_EN, F_CHG_EN, F_VMREG, /* CTRL7 reg fields */
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun 	F_TSDI, F_VINOVPI, F_BATAB, /* IRQ1 reg fields */
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun 	F_CHRVPI, F_CHBATOVI, F_CHTERMI, F_CHRCHGI, F_CH32MI, F_CHTREGI,
81*4882a593Smuzhiyun 	F_CHMIVRI, /* IRQ2 reg fields */
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun 	F_BSTBUSOVI, F_BSTOLI, F_BSTLOWVI, F_BST32SI, /* IRQ3 reg fields */
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun 	F_TSDM, F_VINOVPIM, F_BATABM, /* MASK1 reg fields */
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun 	F_CHRVPIM, F_CHBATOVIM, F_CHTERMIM, F_CHRCHGIM, F_CH32MIM, F_CHTREGIM,
88*4882a593Smuzhiyun 	F_CHMIVRIM, /* MASK2 reg fields */
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun 	F_BSTVINOVIM, F_BSTOLIM, F_BSTLOWVIM, F_BST32SIM, /* MASK3 reg fields */
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun 	F_MAX_FIELDS
93*4882a593Smuzhiyun };
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun static const struct reg_field rt9455_reg_fields[] = {
96*4882a593Smuzhiyun 	[F_STAT]		= REG_FIELD(RT9455_REG_CTRL1, 4, 5),
97*4882a593Smuzhiyun 	[F_BOOST]		= REG_FIELD(RT9455_REG_CTRL1, 3, 3),
98*4882a593Smuzhiyun 	[F_PWR_RDY]		= REG_FIELD(RT9455_REG_CTRL1, 2, 2),
99*4882a593Smuzhiyun 	[F_OTG_PIN_POLARITY]	= REG_FIELD(RT9455_REG_CTRL1, 1, 1),
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun 	[F_IAICR]		= REG_FIELD(RT9455_REG_CTRL2, 6, 7),
102*4882a593Smuzhiyun 	[F_TE_SHDN_EN]		= REG_FIELD(RT9455_REG_CTRL2, 5, 5),
103*4882a593Smuzhiyun 	[F_HIGHER_OCP]		= REG_FIELD(RT9455_REG_CTRL2, 4, 4),
104*4882a593Smuzhiyun 	[F_TE]			= REG_FIELD(RT9455_REG_CTRL2, 3, 3),
105*4882a593Smuzhiyun 	[F_IAICR_INT]		= REG_FIELD(RT9455_REG_CTRL2, 2, 2),
106*4882a593Smuzhiyun 	[F_HIZ]			= REG_FIELD(RT9455_REG_CTRL2, 1, 1),
107*4882a593Smuzhiyun 	[F_OPA_MODE]		= REG_FIELD(RT9455_REG_CTRL2, 0, 0),
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun 	[F_VOREG]		= REG_FIELD(RT9455_REG_CTRL3, 2, 7),
110*4882a593Smuzhiyun 	[F_OTG_PL]		= REG_FIELD(RT9455_REG_CTRL3, 1, 1),
111*4882a593Smuzhiyun 	[F_OTG_EN]		= REG_FIELD(RT9455_REG_CTRL3, 0, 0),
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun 	[F_VENDOR_ID]		= REG_FIELD(RT9455_REG_DEV_ID, 4, 7),
114*4882a593Smuzhiyun 	[F_CHIP_REV]		= REG_FIELD(RT9455_REG_DEV_ID, 0, 3),
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun 	[F_RST]			= REG_FIELD(RT9455_REG_CTRL4, 7, 7),
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun 	[F_TMR_EN]		= REG_FIELD(RT9455_REG_CTRL5, 7, 7),
119*4882a593Smuzhiyun 	[F_MIVR]		= REG_FIELD(RT9455_REG_CTRL5, 4, 5),
120*4882a593Smuzhiyun 	[F_IPREC]		= REG_FIELD(RT9455_REG_CTRL5, 2, 3),
121*4882a593Smuzhiyun 	[F_IEOC_PERCENTAGE]	= REG_FIELD(RT9455_REG_CTRL5, 0, 1),
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun 	[F_IAICR_SEL]		= REG_FIELD(RT9455_REG_CTRL6, 7, 7),
124*4882a593Smuzhiyun 	[F_ICHRG]		= REG_FIELD(RT9455_REG_CTRL6, 4, 6),
125*4882a593Smuzhiyun 	[F_VPREC]		= REG_FIELD(RT9455_REG_CTRL6, 0, 2),
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun 	[F_BATD_EN]		= REG_FIELD(RT9455_REG_CTRL7, 6, 6),
128*4882a593Smuzhiyun 	[F_CHG_EN]		= REG_FIELD(RT9455_REG_CTRL7, 4, 4),
129*4882a593Smuzhiyun 	[F_VMREG]		= REG_FIELD(RT9455_REG_CTRL7, 0, 3),
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun 	[F_TSDI]		= REG_FIELD(RT9455_REG_IRQ1, 7, 7),
132*4882a593Smuzhiyun 	[F_VINOVPI]		= REG_FIELD(RT9455_REG_IRQ1, 6, 6),
133*4882a593Smuzhiyun 	[F_BATAB]		= REG_FIELD(RT9455_REG_IRQ1, 0, 0),
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun 	[F_CHRVPI]		= REG_FIELD(RT9455_REG_IRQ2, 7, 7),
136*4882a593Smuzhiyun 	[F_CHBATOVI]		= REG_FIELD(RT9455_REG_IRQ2, 5, 5),
137*4882a593Smuzhiyun 	[F_CHTERMI]		= REG_FIELD(RT9455_REG_IRQ2, 4, 4),
138*4882a593Smuzhiyun 	[F_CHRCHGI]		= REG_FIELD(RT9455_REG_IRQ2, 3, 3),
139*4882a593Smuzhiyun 	[F_CH32MI]		= REG_FIELD(RT9455_REG_IRQ2, 2, 2),
140*4882a593Smuzhiyun 	[F_CHTREGI]		= REG_FIELD(RT9455_REG_IRQ2, 1, 1),
141*4882a593Smuzhiyun 	[F_CHMIVRI]		= REG_FIELD(RT9455_REG_IRQ2, 0, 0),
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun 	[F_BSTBUSOVI]		= REG_FIELD(RT9455_REG_IRQ3, 7, 7),
144*4882a593Smuzhiyun 	[F_BSTOLI]		= REG_FIELD(RT9455_REG_IRQ3, 6, 6),
145*4882a593Smuzhiyun 	[F_BSTLOWVI]		= REG_FIELD(RT9455_REG_IRQ3, 5, 5),
146*4882a593Smuzhiyun 	[F_BST32SI]		= REG_FIELD(RT9455_REG_IRQ3, 3, 3),
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun 	[F_TSDM]		= REG_FIELD(RT9455_REG_MASK1, 7, 7),
149*4882a593Smuzhiyun 	[F_VINOVPIM]		= REG_FIELD(RT9455_REG_MASK1, 6, 6),
150*4882a593Smuzhiyun 	[F_BATABM]		= REG_FIELD(RT9455_REG_MASK1, 0, 0),
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun 	[F_CHRVPIM]		= REG_FIELD(RT9455_REG_MASK2, 7, 7),
153*4882a593Smuzhiyun 	[F_CHBATOVIM]		= REG_FIELD(RT9455_REG_MASK2, 5, 5),
154*4882a593Smuzhiyun 	[F_CHTERMIM]		= REG_FIELD(RT9455_REG_MASK2, 4, 4),
155*4882a593Smuzhiyun 	[F_CHRCHGIM]		= REG_FIELD(RT9455_REG_MASK2, 3, 3),
156*4882a593Smuzhiyun 	[F_CH32MIM]		= REG_FIELD(RT9455_REG_MASK2, 2, 2),
157*4882a593Smuzhiyun 	[F_CHTREGIM]		= REG_FIELD(RT9455_REG_MASK2, 1, 1),
158*4882a593Smuzhiyun 	[F_CHMIVRIM]		= REG_FIELD(RT9455_REG_MASK2, 0, 0),
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun 	[F_BSTVINOVIM]		= REG_FIELD(RT9455_REG_MASK3, 7, 7),
161*4882a593Smuzhiyun 	[F_BSTOLIM]		= REG_FIELD(RT9455_REG_MASK3, 6, 6),
162*4882a593Smuzhiyun 	[F_BSTLOWVIM]		= REG_FIELD(RT9455_REG_MASK3, 5, 5),
163*4882a593Smuzhiyun 	[F_BST32SIM]		= REG_FIELD(RT9455_REG_MASK3, 3, 3),
164*4882a593Smuzhiyun };
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun #define GET_MASK(fid)	(BIT(rt9455_reg_fields[fid].msb + 1) - \
167*4882a593Smuzhiyun 			 BIT(rt9455_reg_fields[fid].lsb))
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun /*
170*4882a593Smuzhiyun  * Each array initialised below shows the possible real-world values for a
171*4882a593Smuzhiyun  * group of bits belonging to RT9455 registers. The arrays are sorted in
172*4882a593Smuzhiyun  * ascending order. The index of each real-world value represents the value
173*4882a593Smuzhiyun  * that is encoded in the group of bits belonging to RT9455 registers.
174*4882a593Smuzhiyun  */
175*4882a593Smuzhiyun /* REG06[6:4] (ICHRG) in uAh */
176*4882a593Smuzhiyun static const int rt9455_ichrg_values[] = {
177*4882a593Smuzhiyun 	 500000,  650000,  800000,  950000, 1100000, 1250000, 1400000, 1550000
178*4882a593Smuzhiyun };
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun /*
181*4882a593Smuzhiyun  * When the charger is in charge mode, REG02[7:2] represent battery regulation
182*4882a593Smuzhiyun  * voltage.
183*4882a593Smuzhiyun  */
184*4882a593Smuzhiyun /* REG02[7:2] (VOREG) in uV */
185*4882a593Smuzhiyun static const int rt9455_voreg_values[] = {
186*4882a593Smuzhiyun 	3500000, 3520000, 3540000, 3560000, 3580000, 3600000, 3620000, 3640000,
187*4882a593Smuzhiyun 	3660000, 3680000, 3700000, 3720000, 3740000, 3760000, 3780000, 3800000,
188*4882a593Smuzhiyun 	3820000, 3840000, 3860000, 3880000, 3900000, 3920000, 3940000, 3960000,
189*4882a593Smuzhiyun 	3980000, 4000000, 4020000, 4040000, 4060000, 4080000, 4100000, 4120000,
190*4882a593Smuzhiyun 	4140000, 4160000, 4180000, 4200000, 4220000, 4240000, 4260000, 4280000,
191*4882a593Smuzhiyun 	4300000, 4330000, 4350000, 4370000, 4390000, 4410000, 4430000, 4450000,
192*4882a593Smuzhiyun 	4450000, 4450000, 4450000, 4450000, 4450000, 4450000, 4450000, 4450000,
193*4882a593Smuzhiyun 	4450000, 4450000, 4450000, 4450000, 4450000, 4450000, 4450000, 4450000
194*4882a593Smuzhiyun };
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun /*
197*4882a593Smuzhiyun  * When the charger is in boost mode, REG02[7:2] represent boost output
198*4882a593Smuzhiyun  * voltage.
199*4882a593Smuzhiyun  */
200*4882a593Smuzhiyun /* REG02[7:2] (Boost output voltage) in uV */
201*4882a593Smuzhiyun static const int rt9455_boost_voltage_values[] = {
202*4882a593Smuzhiyun 	4425000, 4450000, 4475000, 4500000, 4525000, 4550000, 4575000, 4600000,
203*4882a593Smuzhiyun 	4625000, 4650000, 4675000, 4700000, 4725000, 4750000, 4775000, 4800000,
204*4882a593Smuzhiyun 	4825000, 4850000, 4875000, 4900000, 4925000, 4950000, 4975000, 5000000,
205*4882a593Smuzhiyun 	5025000, 5050000, 5075000, 5100000, 5125000, 5150000, 5175000, 5200000,
206*4882a593Smuzhiyun 	5225000, 5250000, 5275000, 5300000, 5325000, 5350000, 5375000, 5400000,
207*4882a593Smuzhiyun 	5425000, 5450000, 5475000, 5500000, 5525000, 5550000, 5575000, 5600000,
208*4882a593Smuzhiyun 	5600000, 5600000, 5600000, 5600000, 5600000, 5600000, 5600000, 5600000,
209*4882a593Smuzhiyun 	5600000, 5600000, 5600000, 5600000, 5600000, 5600000, 5600000, 5600000,
210*4882a593Smuzhiyun };
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun /* REG07[3:0] (VMREG) in uV */
213*4882a593Smuzhiyun static const int rt9455_vmreg_values[] = {
214*4882a593Smuzhiyun 	4200000, 4220000, 4240000, 4260000, 4280000, 4300000, 4320000, 4340000,
215*4882a593Smuzhiyun 	4360000, 4380000, 4400000, 4430000, 4450000, 4450000, 4450000, 4450000
216*4882a593Smuzhiyun };
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun /* REG05[5:4] (IEOC_PERCENTAGE) */
219*4882a593Smuzhiyun static const int rt9455_ieoc_percentage_values[] = {
220*4882a593Smuzhiyun 	10, 30, 20, 30
221*4882a593Smuzhiyun };
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun /* REG05[1:0] (MIVR) in uV */
224*4882a593Smuzhiyun static const int rt9455_mivr_values[] = {
225*4882a593Smuzhiyun 	4000000, 4250000, 4500000, 5000000
226*4882a593Smuzhiyun };
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun /* REG05[1:0] (IAICR) in uA */
229*4882a593Smuzhiyun static const int rt9455_iaicr_values[] = {
230*4882a593Smuzhiyun 	100000, 500000, 1000000, 2000000
231*4882a593Smuzhiyun };
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun struct rt9455_info {
234*4882a593Smuzhiyun 	struct i2c_client		*client;
235*4882a593Smuzhiyun 	struct regmap			*regmap;
236*4882a593Smuzhiyun 	struct regmap_field		*regmap_fields[F_MAX_FIELDS];
237*4882a593Smuzhiyun 	struct power_supply		*charger;
238*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_USB_PHY)
239*4882a593Smuzhiyun 	struct usb_phy			*usb_phy;
240*4882a593Smuzhiyun 	struct notifier_block		nb;
241*4882a593Smuzhiyun #endif
242*4882a593Smuzhiyun 	struct delayed_work		pwr_rdy_work;
243*4882a593Smuzhiyun 	struct delayed_work		max_charging_time_work;
244*4882a593Smuzhiyun 	struct delayed_work		batt_presence_work;
245*4882a593Smuzhiyun 	u32				voreg;
246*4882a593Smuzhiyun 	u32				boost_voltage;
247*4882a593Smuzhiyun };
248*4882a593Smuzhiyun 
249*4882a593Smuzhiyun /*
250*4882a593Smuzhiyun  * Iterate through each element of the 'tbl' array until an element whose value
251*4882a593Smuzhiyun  * is greater than v is found. Return the index of the respective element,
252*4882a593Smuzhiyun  * or the index of the last element in the array, if no such element is found.
253*4882a593Smuzhiyun  */
rt9455_find_idx(const int tbl[],int tbl_size,int v)254*4882a593Smuzhiyun static unsigned int rt9455_find_idx(const int tbl[], int tbl_size, int v)
255*4882a593Smuzhiyun {
256*4882a593Smuzhiyun 	int i;
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun 	/*
259*4882a593Smuzhiyun 	 * No need to iterate until the last index in the table because
260*4882a593Smuzhiyun 	 * if no element greater than v is found in the table,
261*4882a593Smuzhiyun 	 * or if only the last element is greater than v,
262*4882a593Smuzhiyun 	 * function returns the index of the last element.
263*4882a593Smuzhiyun 	 */
264*4882a593Smuzhiyun 	for (i = 0; i < tbl_size - 1; i++)
265*4882a593Smuzhiyun 		if (v <= tbl[i])
266*4882a593Smuzhiyun 			return i;
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun 	return (tbl_size - 1);
269*4882a593Smuzhiyun }
270*4882a593Smuzhiyun 
rt9455_get_field_val(struct rt9455_info * info,enum rt9455_fields field,const int tbl[],int tbl_size,int * val)271*4882a593Smuzhiyun static int rt9455_get_field_val(struct rt9455_info *info,
272*4882a593Smuzhiyun 				enum rt9455_fields field,
273*4882a593Smuzhiyun 				const int tbl[], int tbl_size, int *val)
274*4882a593Smuzhiyun {
275*4882a593Smuzhiyun 	unsigned int v;
276*4882a593Smuzhiyun 	int ret;
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun 	ret = regmap_field_read(info->regmap_fields[field], &v);
279*4882a593Smuzhiyun 	if (ret)
280*4882a593Smuzhiyun 		return ret;
281*4882a593Smuzhiyun 
282*4882a593Smuzhiyun 	v = (v >= tbl_size) ? (tbl_size - 1) : v;
283*4882a593Smuzhiyun 	*val = tbl[v];
284*4882a593Smuzhiyun 
285*4882a593Smuzhiyun 	return 0;
286*4882a593Smuzhiyun }
287*4882a593Smuzhiyun 
rt9455_set_field_val(struct rt9455_info * info,enum rt9455_fields field,const int tbl[],int tbl_size,int val)288*4882a593Smuzhiyun static int rt9455_set_field_val(struct rt9455_info *info,
289*4882a593Smuzhiyun 				enum rt9455_fields field,
290*4882a593Smuzhiyun 				const int tbl[], int tbl_size, int val)
291*4882a593Smuzhiyun {
292*4882a593Smuzhiyun 	unsigned int idx = rt9455_find_idx(tbl, tbl_size, val);
293*4882a593Smuzhiyun 
294*4882a593Smuzhiyun 	return regmap_field_write(info->regmap_fields[field], idx);
295*4882a593Smuzhiyun }
296*4882a593Smuzhiyun 
rt9455_register_reset(struct rt9455_info * info)297*4882a593Smuzhiyun static int rt9455_register_reset(struct rt9455_info *info)
298*4882a593Smuzhiyun {
299*4882a593Smuzhiyun 	struct device *dev = &info->client->dev;
300*4882a593Smuzhiyun 	unsigned int v;
301*4882a593Smuzhiyun 	int ret, limit = 100;
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun 	ret = regmap_field_write(info->regmap_fields[F_RST], 0x01);
304*4882a593Smuzhiyun 	if (ret) {
305*4882a593Smuzhiyun 		dev_err(dev, "Failed to set RST bit\n");
306*4882a593Smuzhiyun 		return ret;
307*4882a593Smuzhiyun 	}
308*4882a593Smuzhiyun 
309*4882a593Smuzhiyun 	/*
310*4882a593Smuzhiyun 	 * To make sure that reset operation has finished, loop until RST bit
311*4882a593Smuzhiyun 	 * is set to 0.
312*4882a593Smuzhiyun 	 */
313*4882a593Smuzhiyun 	do {
314*4882a593Smuzhiyun 		ret = regmap_field_read(info->regmap_fields[F_RST], &v);
315*4882a593Smuzhiyun 		if (ret) {
316*4882a593Smuzhiyun 			dev_err(dev, "Failed to read RST bit\n");
317*4882a593Smuzhiyun 			return ret;
318*4882a593Smuzhiyun 		}
319*4882a593Smuzhiyun 
320*4882a593Smuzhiyun 		if (!v)
321*4882a593Smuzhiyun 			break;
322*4882a593Smuzhiyun 
323*4882a593Smuzhiyun 		usleep_range(10, 100);
324*4882a593Smuzhiyun 	} while (--limit);
325*4882a593Smuzhiyun 
326*4882a593Smuzhiyun 	if (!limit)
327*4882a593Smuzhiyun 		return -EIO;
328*4882a593Smuzhiyun 
329*4882a593Smuzhiyun 	return 0;
330*4882a593Smuzhiyun }
331*4882a593Smuzhiyun 
332*4882a593Smuzhiyun /* Charger power supply property routines */
333*4882a593Smuzhiyun static enum power_supply_property rt9455_charger_properties[] = {
334*4882a593Smuzhiyun 	POWER_SUPPLY_PROP_STATUS,
335*4882a593Smuzhiyun 	POWER_SUPPLY_PROP_HEALTH,
336*4882a593Smuzhiyun 	POWER_SUPPLY_PROP_PRESENT,
337*4882a593Smuzhiyun 	POWER_SUPPLY_PROP_ONLINE,
338*4882a593Smuzhiyun 	POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,
339*4882a593Smuzhiyun 	POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX,
340*4882a593Smuzhiyun 	POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE,
341*4882a593Smuzhiyun 	POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX,
342*4882a593Smuzhiyun 	POWER_SUPPLY_PROP_SCOPE,
343*4882a593Smuzhiyun 	POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT,
344*4882a593Smuzhiyun 	POWER_SUPPLY_PROP_MODEL_NAME,
345*4882a593Smuzhiyun 	POWER_SUPPLY_PROP_MANUFACTURER,
346*4882a593Smuzhiyun };
347*4882a593Smuzhiyun 
348*4882a593Smuzhiyun static char *rt9455_charger_supplied_to[] = {
349*4882a593Smuzhiyun 	"main-battery",
350*4882a593Smuzhiyun };
351*4882a593Smuzhiyun 
rt9455_charger_get_status(struct rt9455_info * info,union power_supply_propval * val)352*4882a593Smuzhiyun static int rt9455_charger_get_status(struct rt9455_info *info,
353*4882a593Smuzhiyun 				     union power_supply_propval *val)
354*4882a593Smuzhiyun {
355*4882a593Smuzhiyun 	unsigned int v, pwr_rdy;
356*4882a593Smuzhiyun 	int ret;
357*4882a593Smuzhiyun 
358*4882a593Smuzhiyun 	ret = regmap_field_read(info->regmap_fields[F_PWR_RDY],
359*4882a593Smuzhiyun 				&pwr_rdy);
360*4882a593Smuzhiyun 	if (ret) {
361*4882a593Smuzhiyun 		dev_err(&info->client->dev, "Failed to read PWR_RDY bit\n");
362*4882a593Smuzhiyun 		return ret;
363*4882a593Smuzhiyun 	}
364*4882a593Smuzhiyun 
365*4882a593Smuzhiyun 	/*
366*4882a593Smuzhiyun 	 * If PWR_RDY bit is unset, the battery is discharging. Otherwise,
367*4882a593Smuzhiyun 	 * STAT bits value must be checked.
368*4882a593Smuzhiyun 	 */
369*4882a593Smuzhiyun 	if (!pwr_rdy) {
370*4882a593Smuzhiyun 		val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
371*4882a593Smuzhiyun 		return 0;
372*4882a593Smuzhiyun 	}
373*4882a593Smuzhiyun 
374*4882a593Smuzhiyun 	ret = regmap_field_read(info->regmap_fields[F_STAT], &v);
375*4882a593Smuzhiyun 	if (ret) {
376*4882a593Smuzhiyun 		dev_err(&info->client->dev, "Failed to read STAT bits\n");
377*4882a593Smuzhiyun 		return ret;
378*4882a593Smuzhiyun 	}
379*4882a593Smuzhiyun 
380*4882a593Smuzhiyun 	switch (v) {
381*4882a593Smuzhiyun 	case 0:
382*4882a593Smuzhiyun 		/*
383*4882a593Smuzhiyun 		 * If PWR_RDY bit is set, but STAT bits value is 0, the charger
384*4882a593Smuzhiyun 		 * may be in one of the following cases:
385*4882a593Smuzhiyun 		 * 1. CHG_EN bit is 0.
386*4882a593Smuzhiyun 		 * 2. CHG_EN bit is 1 but the battery is not connected.
387*4882a593Smuzhiyun 		 * In any of these cases, POWER_SUPPLY_STATUS_NOT_CHARGING is
388*4882a593Smuzhiyun 		 * returned.
389*4882a593Smuzhiyun 		 */
390*4882a593Smuzhiyun 		val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
391*4882a593Smuzhiyun 		return 0;
392*4882a593Smuzhiyun 	case 1:
393*4882a593Smuzhiyun 		val->intval = POWER_SUPPLY_STATUS_CHARGING;
394*4882a593Smuzhiyun 		return 0;
395*4882a593Smuzhiyun 	case 2:
396*4882a593Smuzhiyun 		val->intval = POWER_SUPPLY_STATUS_FULL;
397*4882a593Smuzhiyun 		return 0;
398*4882a593Smuzhiyun 	default:
399*4882a593Smuzhiyun 		val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
400*4882a593Smuzhiyun 		return 0;
401*4882a593Smuzhiyun 	}
402*4882a593Smuzhiyun }
403*4882a593Smuzhiyun 
rt9455_charger_get_health(struct rt9455_info * info,union power_supply_propval * val)404*4882a593Smuzhiyun static int rt9455_charger_get_health(struct rt9455_info *info,
405*4882a593Smuzhiyun 				     union power_supply_propval *val)
406*4882a593Smuzhiyun {
407*4882a593Smuzhiyun 	struct device *dev = &info->client->dev;
408*4882a593Smuzhiyun 	unsigned int v;
409*4882a593Smuzhiyun 	int ret;
410*4882a593Smuzhiyun 
411*4882a593Smuzhiyun 	val->intval = POWER_SUPPLY_HEALTH_GOOD;
412*4882a593Smuzhiyun 
413*4882a593Smuzhiyun 	ret = regmap_read(info->regmap, RT9455_REG_IRQ1, &v);
414*4882a593Smuzhiyun 	if (ret) {
415*4882a593Smuzhiyun 		dev_err(dev, "Failed to read IRQ1 register\n");
416*4882a593Smuzhiyun 		return ret;
417*4882a593Smuzhiyun 	}
418*4882a593Smuzhiyun 
419*4882a593Smuzhiyun 	if (v & GET_MASK(F_TSDI)) {
420*4882a593Smuzhiyun 		val->intval = POWER_SUPPLY_HEALTH_OVERHEAT;
421*4882a593Smuzhiyun 		return 0;
422*4882a593Smuzhiyun 	}
423*4882a593Smuzhiyun 	if (v & GET_MASK(F_VINOVPI)) {
424*4882a593Smuzhiyun 		val->intval = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
425*4882a593Smuzhiyun 		return 0;
426*4882a593Smuzhiyun 	}
427*4882a593Smuzhiyun 	if (v & GET_MASK(F_BATAB)) {
428*4882a593Smuzhiyun 		val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
429*4882a593Smuzhiyun 		return 0;
430*4882a593Smuzhiyun 	}
431*4882a593Smuzhiyun 
432*4882a593Smuzhiyun 	ret = regmap_read(info->regmap, RT9455_REG_IRQ2, &v);
433*4882a593Smuzhiyun 	if (ret) {
434*4882a593Smuzhiyun 		dev_err(dev, "Failed to read IRQ2 register\n");
435*4882a593Smuzhiyun 		return ret;
436*4882a593Smuzhiyun 	}
437*4882a593Smuzhiyun 
438*4882a593Smuzhiyun 	if (v & GET_MASK(F_CHBATOVI)) {
439*4882a593Smuzhiyun 		val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
440*4882a593Smuzhiyun 		return 0;
441*4882a593Smuzhiyun 	}
442*4882a593Smuzhiyun 	if (v & GET_MASK(F_CH32MI)) {
443*4882a593Smuzhiyun 		val->intval = POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE;
444*4882a593Smuzhiyun 		return 0;
445*4882a593Smuzhiyun 	}
446*4882a593Smuzhiyun 
447*4882a593Smuzhiyun 	ret = regmap_read(info->regmap, RT9455_REG_IRQ3, &v);
448*4882a593Smuzhiyun 	if (ret) {
449*4882a593Smuzhiyun 		dev_err(dev, "Failed to read IRQ3 register\n");
450*4882a593Smuzhiyun 		return ret;
451*4882a593Smuzhiyun 	}
452*4882a593Smuzhiyun 
453*4882a593Smuzhiyun 	if (v & GET_MASK(F_BSTBUSOVI)) {
454*4882a593Smuzhiyun 		val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
455*4882a593Smuzhiyun 		return 0;
456*4882a593Smuzhiyun 	}
457*4882a593Smuzhiyun 	if (v & GET_MASK(F_BSTOLI)) {
458*4882a593Smuzhiyun 		val->intval = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
459*4882a593Smuzhiyun 		return 0;
460*4882a593Smuzhiyun 	}
461*4882a593Smuzhiyun 	if (v & GET_MASK(F_BSTLOWVI)) {
462*4882a593Smuzhiyun 		val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
463*4882a593Smuzhiyun 		return 0;
464*4882a593Smuzhiyun 	}
465*4882a593Smuzhiyun 	if (v & GET_MASK(F_BST32SI)) {
466*4882a593Smuzhiyun 		val->intval = POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE;
467*4882a593Smuzhiyun 		return 0;
468*4882a593Smuzhiyun 	}
469*4882a593Smuzhiyun 
470*4882a593Smuzhiyun 	ret = regmap_field_read(info->regmap_fields[F_STAT], &v);
471*4882a593Smuzhiyun 	if (ret) {
472*4882a593Smuzhiyun 		dev_err(dev, "Failed to read STAT bits\n");
473*4882a593Smuzhiyun 		return ret;
474*4882a593Smuzhiyun 	}
475*4882a593Smuzhiyun 
476*4882a593Smuzhiyun 	if (v == RT9455_FAULT) {
477*4882a593Smuzhiyun 		val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
478*4882a593Smuzhiyun 		return 0;
479*4882a593Smuzhiyun 	}
480*4882a593Smuzhiyun 
481*4882a593Smuzhiyun 	return 0;
482*4882a593Smuzhiyun }
483*4882a593Smuzhiyun 
rt9455_charger_get_battery_presence(struct rt9455_info * info,union power_supply_propval * val)484*4882a593Smuzhiyun static int rt9455_charger_get_battery_presence(struct rt9455_info *info,
485*4882a593Smuzhiyun 					       union power_supply_propval *val)
486*4882a593Smuzhiyun {
487*4882a593Smuzhiyun 	unsigned int v;
488*4882a593Smuzhiyun 	int ret;
489*4882a593Smuzhiyun 
490*4882a593Smuzhiyun 	ret = regmap_field_read(info->regmap_fields[F_BATAB], &v);
491*4882a593Smuzhiyun 	if (ret) {
492*4882a593Smuzhiyun 		dev_err(&info->client->dev, "Failed to read BATAB bit\n");
493*4882a593Smuzhiyun 		return ret;
494*4882a593Smuzhiyun 	}
495*4882a593Smuzhiyun 
496*4882a593Smuzhiyun 	/*
497*4882a593Smuzhiyun 	 * Since BATAB is 1 when battery is NOT present and 0 otherwise,
498*4882a593Smuzhiyun 	 * !BATAB is returned.
499*4882a593Smuzhiyun 	 */
500*4882a593Smuzhiyun 	val->intval = !v;
501*4882a593Smuzhiyun 
502*4882a593Smuzhiyun 	return 0;
503*4882a593Smuzhiyun }
504*4882a593Smuzhiyun 
rt9455_charger_get_online(struct rt9455_info * info,union power_supply_propval * val)505*4882a593Smuzhiyun static int rt9455_charger_get_online(struct rt9455_info *info,
506*4882a593Smuzhiyun 				     union power_supply_propval *val)
507*4882a593Smuzhiyun {
508*4882a593Smuzhiyun 	unsigned int v;
509*4882a593Smuzhiyun 	int ret;
510*4882a593Smuzhiyun 
511*4882a593Smuzhiyun 	ret = regmap_field_read(info->regmap_fields[F_PWR_RDY], &v);
512*4882a593Smuzhiyun 	if (ret) {
513*4882a593Smuzhiyun 		dev_err(&info->client->dev, "Failed to read PWR_RDY bit\n");
514*4882a593Smuzhiyun 		return ret;
515*4882a593Smuzhiyun 	}
516*4882a593Smuzhiyun 
517*4882a593Smuzhiyun 	val->intval = (int)v;
518*4882a593Smuzhiyun 
519*4882a593Smuzhiyun 	return 0;
520*4882a593Smuzhiyun }
521*4882a593Smuzhiyun 
rt9455_charger_get_current(struct rt9455_info * info,union power_supply_propval * val)522*4882a593Smuzhiyun static int rt9455_charger_get_current(struct rt9455_info *info,
523*4882a593Smuzhiyun 				      union power_supply_propval *val)
524*4882a593Smuzhiyun {
525*4882a593Smuzhiyun 	int curr;
526*4882a593Smuzhiyun 	int ret;
527*4882a593Smuzhiyun 
528*4882a593Smuzhiyun 	ret = rt9455_get_field_val(info, F_ICHRG,
529*4882a593Smuzhiyun 				   rt9455_ichrg_values,
530*4882a593Smuzhiyun 				   ARRAY_SIZE(rt9455_ichrg_values),
531*4882a593Smuzhiyun 				   &curr);
532*4882a593Smuzhiyun 	if (ret) {
533*4882a593Smuzhiyun 		dev_err(&info->client->dev, "Failed to read ICHRG value\n");
534*4882a593Smuzhiyun 		return ret;
535*4882a593Smuzhiyun 	}
536*4882a593Smuzhiyun 
537*4882a593Smuzhiyun 	val->intval = curr;
538*4882a593Smuzhiyun 
539*4882a593Smuzhiyun 	return 0;
540*4882a593Smuzhiyun }
541*4882a593Smuzhiyun 
rt9455_charger_get_current_max(struct rt9455_info * info,union power_supply_propval * val)542*4882a593Smuzhiyun static int rt9455_charger_get_current_max(struct rt9455_info *info,
543*4882a593Smuzhiyun 					  union power_supply_propval *val)
544*4882a593Smuzhiyun {
545*4882a593Smuzhiyun 	int idx = ARRAY_SIZE(rt9455_ichrg_values) - 1;
546*4882a593Smuzhiyun 
547*4882a593Smuzhiyun 	val->intval = rt9455_ichrg_values[idx];
548*4882a593Smuzhiyun 
549*4882a593Smuzhiyun 	return 0;
550*4882a593Smuzhiyun }
551*4882a593Smuzhiyun 
rt9455_charger_get_voltage(struct rt9455_info * info,union power_supply_propval * val)552*4882a593Smuzhiyun static int rt9455_charger_get_voltage(struct rt9455_info *info,
553*4882a593Smuzhiyun 				      union power_supply_propval *val)
554*4882a593Smuzhiyun {
555*4882a593Smuzhiyun 	int voltage;
556*4882a593Smuzhiyun 	int ret;
557*4882a593Smuzhiyun 
558*4882a593Smuzhiyun 	ret = rt9455_get_field_val(info, F_VOREG,
559*4882a593Smuzhiyun 				   rt9455_voreg_values,
560*4882a593Smuzhiyun 				   ARRAY_SIZE(rt9455_voreg_values),
561*4882a593Smuzhiyun 				   &voltage);
562*4882a593Smuzhiyun 	if (ret) {
563*4882a593Smuzhiyun 		dev_err(&info->client->dev, "Failed to read VOREG value\n");
564*4882a593Smuzhiyun 		return ret;
565*4882a593Smuzhiyun 	}
566*4882a593Smuzhiyun 
567*4882a593Smuzhiyun 	val->intval = voltage;
568*4882a593Smuzhiyun 
569*4882a593Smuzhiyun 	return 0;
570*4882a593Smuzhiyun }
571*4882a593Smuzhiyun 
rt9455_charger_get_voltage_max(struct rt9455_info * info,union power_supply_propval * val)572*4882a593Smuzhiyun static int rt9455_charger_get_voltage_max(struct rt9455_info *info,
573*4882a593Smuzhiyun 					  union power_supply_propval *val)
574*4882a593Smuzhiyun {
575*4882a593Smuzhiyun 	int idx = ARRAY_SIZE(rt9455_vmreg_values) - 1;
576*4882a593Smuzhiyun 
577*4882a593Smuzhiyun 	val->intval = rt9455_vmreg_values[idx];
578*4882a593Smuzhiyun 
579*4882a593Smuzhiyun 	return 0;
580*4882a593Smuzhiyun }
581*4882a593Smuzhiyun 
rt9455_charger_get_term_current(struct rt9455_info * info,union power_supply_propval * val)582*4882a593Smuzhiyun static int rt9455_charger_get_term_current(struct rt9455_info *info,
583*4882a593Smuzhiyun 					   union power_supply_propval *val)
584*4882a593Smuzhiyun {
585*4882a593Smuzhiyun 	struct device *dev = &info->client->dev;
586*4882a593Smuzhiyun 	int ichrg, ieoc_percentage, ret;
587*4882a593Smuzhiyun 
588*4882a593Smuzhiyun 	ret = rt9455_get_field_val(info, F_ICHRG,
589*4882a593Smuzhiyun 				   rt9455_ichrg_values,
590*4882a593Smuzhiyun 				   ARRAY_SIZE(rt9455_ichrg_values),
591*4882a593Smuzhiyun 				   &ichrg);
592*4882a593Smuzhiyun 	if (ret) {
593*4882a593Smuzhiyun 		dev_err(dev, "Failed to read ICHRG value\n");
594*4882a593Smuzhiyun 		return ret;
595*4882a593Smuzhiyun 	}
596*4882a593Smuzhiyun 
597*4882a593Smuzhiyun 	ret = rt9455_get_field_val(info, F_IEOC_PERCENTAGE,
598*4882a593Smuzhiyun 				   rt9455_ieoc_percentage_values,
599*4882a593Smuzhiyun 				   ARRAY_SIZE(rt9455_ieoc_percentage_values),
600*4882a593Smuzhiyun 				   &ieoc_percentage);
601*4882a593Smuzhiyun 	if (ret) {
602*4882a593Smuzhiyun 		dev_err(dev, "Failed to read IEOC value\n");
603*4882a593Smuzhiyun 		return ret;
604*4882a593Smuzhiyun 	}
605*4882a593Smuzhiyun 
606*4882a593Smuzhiyun 	val->intval = ichrg * ieoc_percentage / 100;
607*4882a593Smuzhiyun 
608*4882a593Smuzhiyun 	return 0;
609*4882a593Smuzhiyun }
610*4882a593Smuzhiyun 
rt9455_charger_get_property(struct power_supply * psy,enum power_supply_property psp,union power_supply_propval * val)611*4882a593Smuzhiyun static int rt9455_charger_get_property(struct power_supply *psy,
612*4882a593Smuzhiyun 				       enum power_supply_property psp,
613*4882a593Smuzhiyun 				       union power_supply_propval *val)
614*4882a593Smuzhiyun {
615*4882a593Smuzhiyun 	struct rt9455_info *info = power_supply_get_drvdata(psy);
616*4882a593Smuzhiyun 
617*4882a593Smuzhiyun 	switch (psp) {
618*4882a593Smuzhiyun 	case POWER_SUPPLY_PROP_STATUS:
619*4882a593Smuzhiyun 		return rt9455_charger_get_status(info, val);
620*4882a593Smuzhiyun 	case POWER_SUPPLY_PROP_HEALTH:
621*4882a593Smuzhiyun 		return rt9455_charger_get_health(info, val);
622*4882a593Smuzhiyun 	case POWER_SUPPLY_PROP_PRESENT:
623*4882a593Smuzhiyun 		return rt9455_charger_get_battery_presence(info, val);
624*4882a593Smuzhiyun 	case POWER_SUPPLY_PROP_ONLINE:
625*4882a593Smuzhiyun 		return rt9455_charger_get_online(info, val);
626*4882a593Smuzhiyun 	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
627*4882a593Smuzhiyun 		return rt9455_charger_get_current(info, val);
628*4882a593Smuzhiyun 	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX:
629*4882a593Smuzhiyun 		return rt9455_charger_get_current_max(info, val);
630*4882a593Smuzhiyun 	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
631*4882a593Smuzhiyun 		return rt9455_charger_get_voltage(info, val);
632*4882a593Smuzhiyun 	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX:
633*4882a593Smuzhiyun 		return rt9455_charger_get_voltage_max(info, val);
634*4882a593Smuzhiyun 	case POWER_SUPPLY_PROP_SCOPE:
635*4882a593Smuzhiyun 		val->intval = POWER_SUPPLY_SCOPE_SYSTEM;
636*4882a593Smuzhiyun 		return 0;
637*4882a593Smuzhiyun 	case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT:
638*4882a593Smuzhiyun 		return rt9455_charger_get_term_current(info, val);
639*4882a593Smuzhiyun 	case POWER_SUPPLY_PROP_MODEL_NAME:
640*4882a593Smuzhiyun 		val->strval = RT9455_MODEL_NAME;
641*4882a593Smuzhiyun 		return 0;
642*4882a593Smuzhiyun 	case POWER_SUPPLY_PROP_MANUFACTURER:
643*4882a593Smuzhiyun 		val->strval = RT9455_MANUFACTURER;
644*4882a593Smuzhiyun 		return 0;
645*4882a593Smuzhiyun 	default:
646*4882a593Smuzhiyun 		return -ENODATA;
647*4882a593Smuzhiyun 	}
648*4882a593Smuzhiyun }
649*4882a593Smuzhiyun 
rt9455_hw_init(struct rt9455_info * info,u32 ichrg,u32 ieoc_percentage,u32 mivr,u32 iaicr)650*4882a593Smuzhiyun static int rt9455_hw_init(struct rt9455_info *info, u32 ichrg,
651*4882a593Smuzhiyun 			  u32 ieoc_percentage,
652*4882a593Smuzhiyun 			  u32 mivr, u32 iaicr)
653*4882a593Smuzhiyun {
654*4882a593Smuzhiyun 	struct device *dev = &info->client->dev;
655*4882a593Smuzhiyun 	int idx, ret;
656*4882a593Smuzhiyun 
657*4882a593Smuzhiyun 	ret = rt9455_register_reset(info);
658*4882a593Smuzhiyun 	if (ret) {
659*4882a593Smuzhiyun 		dev_err(dev, "Power On Reset failed\n");
660*4882a593Smuzhiyun 		return ret;
661*4882a593Smuzhiyun 	}
662*4882a593Smuzhiyun 
663*4882a593Smuzhiyun 	/* Set TE bit in order to enable end of charge detection */
664*4882a593Smuzhiyun 	ret = regmap_field_write(info->regmap_fields[F_TE], 1);
665*4882a593Smuzhiyun 	if (ret) {
666*4882a593Smuzhiyun 		dev_err(dev, "Failed to set TE bit\n");
667*4882a593Smuzhiyun 		return ret;
668*4882a593Smuzhiyun 	}
669*4882a593Smuzhiyun 
670*4882a593Smuzhiyun 	/* Set TE_SHDN_EN bit in order to enable end of charge detection */
671*4882a593Smuzhiyun 	ret = regmap_field_write(info->regmap_fields[F_TE_SHDN_EN], 1);
672*4882a593Smuzhiyun 	if (ret) {
673*4882a593Smuzhiyun 		dev_err(dev, "Failed to set TE_SHDN_EN bit\n");
674*4882a593Smuzhiyun 		return ret;
675*4882a593Smuzhiyun 	}
676*4882a593Smuzhiyun 
677*4882a593Smuzhiyun 	/*
678*4882a593Smuzhiyun 	 * Set BATD_EN bit in order to enable battery detection
679*4882a593Smuzhiyun 	 * when charging is done
680*4882a593Smuzhiyun 	 */
681*4882a593Smuzhiyun 	ret = regmap_field_write(info->regmap_fields[F_BATD_EN], 1);
682*4882a593Smuzhiyun 	if (ret) {
683*4882a593Smuzhiyun 		dev_err(dev, "Failed to set BATD_EN bit\n");
684*4882a593Smuzhiyun 		return ret;
685*4882a593Smuzhiyun 	}
686*4882a593Smuzhiyun 
687*4882a593Smuzhiyun 	/*
688*4882a593Smuzhiyun 	 * Disable Safety Timer. In charge mode, this timer terminates charging
689*4882a593Smuzhiyun 	 * if no read or write via I2C is done within 32 minutes. This timer
690*4882a593Smuzhiyun 	 * avoids overcharging the baterry when the OS is not loaded and the
691*4882a593Smuzhiyun 	 * charger is connected to a power source.
692*4882a593Smuzhiyun 	 * In boost mode, this timer triggers BST32SI interrupt if no read or
693*4882a593Smuzhiyun 	 * write via I2C is done within 32 seconds.
694*4882a593Smuzhiyun 	 * When the OS is loaded and the charger driver is inserted, it is used
695*4882a593Smuzhiyun 	 * delayed_work, named max_charging_time_work, to avoid overcharging
696*4882a593Smuzhiyun 	 * the battery.
697*4882a593Smuzhiyun 	 */
698*4882a593Smuzhiyun 	ret = regmap_field_write(info->regmap_fields[F_TMR_EN], 0x00);
699*4882a593Smuzhiyun 	if (ret) {
700*4882a593Smuzhiyun 		dev_err(dev, "Failed to disable Safety Timer\n");
701*4882a593Smuzhiyun 		return ret;
702*4882a593Smuzhiyun 	}
703*4882a593Smuzhiyun 
704*4882a593Smuzhiyun 	/* Set ICHRG to value retrieved from device-specific data */
705*4882a593Smuzhiyun 	ret = rt9455_set_field_val(info, F_ICHRG,
706*4882a593Smuzhiyun 				   rt9455_ichrg_values,
707*4882a593Smuzhiyun 				   ARRAY_SIZE(rt9455_ichrg_values), ichrg);
708*4882a593Smuzhiyun 	if (ret) {
709*4882a593Smuzhiyun 		dev_err(dev, "Failed to set ICHRG value\n");
710*4882a593Smuzhiyun 		return ret;
711*4882a593Smuzhiyun 	}
712*4882a593Smuzhiyun 
713*4882a593Smuzhiyun 	/* Set IEOC Percentage to value retrieved from device-specific data */
714*4882a593Smuzhiyun 	ret = rt9455_set_field_val(info, F_IEOC_PERCENTAGE,
715*4882a593Smuzhiyun 				   rt9455_ieoc_percentage_values,
716*4882a593Smuzhiyun 				   ARRAY_SIZE(rt9455_ieoc_percentage_values),
717*4882a593Smuzhiyun 				   ieoc_percentage);
718*4882a593Smuzhiyun 	if (ret) {
719*4882a593Smuzhiyun 		dev_err(dev, "Failed to set IEOC Percentage value\n");
720*4882a593Smuzhiyun 		return ret;
721*4882a593Smuzhiyun 	}
722*4882a593Smuzhiyun 
723*4882a593Smuzhiyun 	/* Set VOREG to value retrieved from device-specific data */
724*4882a593Smuzhiyun 	ret = rt9455_set_field_val(info, F_VOREG,
725*4882a593Smuzhiyun 				   rt9455_voreg_values,
726*4882a593Smuzhiyun 				   ARRAY_SIZE(rt9455_voreg_values),
727*4882a593Smuzhiyun 				   info->voreg);
728*4882a593Smuzhiyun 	if (ret) {
729*4882a593Smuzhiyun 		dev_err(dev, "Failed to set VOREG value\n");
730*4882a593Smuzhiyun 		return ret;
731*4882a593Smuzhiyun 	}
732*4882a593Smuzhiyun 
733*4882a593Smuzhiyun 	/* Set VMREG value to maximum (4.45V). */
734*4882a593Smuzhiyun 	idx = ARRAY_SIZE(rt9455_vmreg_values) - 1;
735*4882a593Smuzhiyun 	ret = rt9455_set_field_val(info, F_VMREG,
736*4882a593Smuzhiyun 				   rt9455_vmreg_values,
737*4882a593Smuzhiyun 				   ARRAY_SIZE(rt9455_vmreg_values),
738*4882a593Smuzhiyun 				   rt9455_vmreg_values[idx]);
739*4882a593Smuzhiyun 	if (ret) {
740*4882a593Smuzhiyun 		dev_err(dev, "Failed to set VMREG value\n");
741*4882a593Smuzhiyun 		return ret;
742*4882a593Smuzhiyun 	}
743*4882a593Smuzhiyun 
744*4882a593Smuzhiyun 	/*
745*4882a593Smuzhiyun 	 * Set MIVR to value retrieved from device-specific data.
746*4882a593Smuzhiyun 	 * If no value is specified, default value for MIVR is 4.5V.
747*4882a593Smuzhiyun 	 */
748*4882a593Smuzhiyun 	if (mivr == -1)
749*4882a593Smuzhiyun 		mivr = 4500000;
750*4882a593Smuzhiyun 
751*4882a593Smuzhiyun 	ret = rt9455_set_field_val(info, F_MIVR,
752*4882a593Smuzhiyun 				   rt9455_mivr_values,
753*4882a593Smuzhiyun 				   ARRAY_SIZE(rt9455_mivr_values), mivr);
754*4882a593Smuzhiyun 	if (ret) {
755*4882a593Smuzhiyun 		dev_err(dev, "Failed to set MIVR value\n");
756*4882a593Smuzhiyun 		return ret;
757*4882a593Smuzhiyun 	}
758*4882a593Smuzhiyun 
759*4882a593Smuzhiyun 	/*
760*4882a593Smuzhiyun 	 * Set IAICR to value retrieved from device-specific data.
761*4882a593Smuzhiyun 	 * If no value is specified, default value for IAICR is 500 mA.
762*4882a593Smuzhiyun 	 */
763*4882a593Smuzhiyun 	if (iaicr == -1)
764*4882a593Smuzhiyun 		iaicr = 500000;
765*4882a593Smuzhiyun 
766*4882a593Smuzhiyun 	ret = rt9455_set_field_val(info, F_IAICR,
767*4882a593Smuzhiyun 				   rt9455_iaicr_values,
768*4882a593Smuzhiyun 				   ARRAY_SIZE(rt9455_iaicr_values), iaicr);
769*4882a593Smuzhiyun 	if (ret) {
770*4882a593Smuzhiyun 		dev_err(dev, "Failed to set IAICR value\n");
771*4882a593Smuzhiyun 		return ret;
772*4882a593Smuzhiyun 	}
773*4882a593Smuzhiyun 
774*4882a593Smuzhiyun 	/*
775*4882a593Smuzhiyun 	 * Set IAICR_INT bit so that IAICR value is determined by IAICR bits
776*4882a593Smuzhiyun 	 * and not by OTG pin.
777*4882a593Smuzhiyun 	 */
778*4882a593Smuzhiyun 	ret = regmap_field_write(info->regmap_fields[F_IAICR_INT], 0x01);
779*4882a593Smuzhiyun 	if (ret) {
780*4882a593Smuzhiyun 		dev_err(dev, "Failed to set IAICR_INT bit\n");
781*4882a593Smuzhiyun 		return ret;
782*4882a593Smuzhiyun 	}
783*4882a593Smuzhiyun 
784*4882a593Smuzhiyun 	/*
785*4882a593Smuzhiyun 	 * Disable CHMIVRI interrupt. Because the driver sets MIVR value,
786*4882a593Smuzhiyun 	 * CHMIVRI is triggered, but there is no action to be taken by the
787*4882a593Smuzhiyun 	 * driver when CHMIVRI is triggered.
788*4882a593Smuzhiyun 	 */
789*4882a593Smuzhiyun 	ret = regmap_field_write(info->regmap_fields[F_CHMIVRIM], 0x01);
790*4882a593Smuzhiyun 	if (ret) {
791*4882a593Smuzhiyun 		dev_err(dev, "Failed to mask CHMIVRI interrupt\n");
792*4882a593Smuzhiyun 		return ret;
793*4882a593Smuzhiyun 	}
794*4882a593Smuzhiyun 
795*4882a593Smuzhiyun 	return 0;
796*4882a593Smuzhiyun }
797*4882a593Smuzhiyun 
798*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_USB_PHY)
799*4882a593Smuzhiyun /*
800*4882a593Smuzhiyun  * Before setting the charger into boost mode, boost output voltage is
801*4882a593Smuzhiyun  * set. This is needed because boost output voltage may differ from battery
802*4882a593Smuzhiyun  * regulation voltage. F_VOREG bits represent either battery regulation voltage
803*4882a593Smuzhiyun  * or boost output voltage, depending on the mode the charger is. Both battery
804*4882a593Smuzhiyun  * regulation voltage and boost output voltage are read from DT/ACPI during
805*4882a593Smuzhiyun  * probe.
806*4882a593Smuzhiyun  */
rt9455_set_boost_voltage_before_boost_mode(struct rt9455_info * info)807*4882a593Smuzhiyun static int rt9455_set_boost_voltage_before_boost_mode(struct rt9455_info *info)
808*4882a593Smuzhiyun {
809*4882a593Smuzhiyun 	struct device *dev = &info->client->dev;
810*4882a593Smuzhiyun 	int ret;
811*4882a593Smuzhiyun 
812*4882a593Smuzhiyun 	ret = rt9455_set_field_val(info, F_VOREG,
813*4882a593Smuzhiyun 				   rt9455_boost_voltage_values,
814*4882a593Smuzhiyun 				   ARRAY_SIZE(rt9455_boost_voltage_values),
815*4882a593Smuzhiyun 				   info->boost_voltage);
816*4882a593Smuzhiyun 	if (ret) {
817*4882a593Smuzhiyun 		dev_err(dev, "Failed to set boost output voltage value\n");
818*4882a593Smuzhiyun 		return ret;
819*4882a593Smuzhiyun 	}
820*4882a593Smuzhiyun 
821*4882a593Smuzhiyun 	return 0;
822*4882a593Smuzhiyun }
823*4882a593Smuzhiyun #endif
824*4882a593Smuzhiyun 
825*4882a593Smuzhiyun /*
826*4882a593Smuzhiyun  * Before setting the charger into charge mode, battery regulation voltage is
827*4882a593Smuzhiyun  * set. This is needed because boost output voltage may differ from battery
828*4882a593Smuzhiyun  * regulation voltage. F_VOREG bits represent either battery regulation voltage
829*4882a593Smuzhiyun  * or boost output voltage, depending on the mode the charger is. Both battery
830*4882a593Smuzhiyun  * regulation voltage and boost output voltage are read from DT/ACPI during
831*4882a593Smuzhiyun  * probe.
832*4882a593Smuzhiyun  */
rt9455_set_voreg_before_charge_mode(struct rt9455_info * info)833*4882a593Smuzhiyun static int rt9455_set_voreg_before_charge_mode(struct rt9455_info *info)
834*4882a593Smuzhiyun {
835*4882a593Smuzhiyun 	struct device *dev = &info->client->dev;
836*4882a593Smuzhiyun 	int ret;
837*4882a593Smuzhiyun 
838*4882a593Smuzhiyun 	ret = rt9455_set_field_val(info, F_VOREG,
839*4882a593Smuzhiyun 				   rt9455_voreg_values,
840*4882a593Smuzhiyun 				   ARRAY_SIZE(rt9455_voreg_values),
841*4882a593Smuzhiyun 				   info->voreg);
842*4882a593Smuzhiyun 	if (ret) {
843*4882a593Smuzhiyun 		dev_err(dev, "Failed to set VOREG value\n");
844*4882a593Smuzhiyun 		return ret;
845*4882a593Smuzhiyun 	}
846*4882a593Smuzhiyun 
847*4882a593Smuzhiyun 	return 0;
848*4882a593Smuzhiyun }
849*4882a593Smuzhiyun 
rt9455_irq_handler_check_irq1_register(struct rt9455_info * info,bool * _is_battery_absent,bool * _alert_userspace)850*4882a593Smuzhiyun static int rt9455_irq_handler_check_irq1_register(struct rt9455_info *info,
851*4882a593Smuzhiyun 						  bool *_is_battery_absent,
852*4882a593Smuzhiyun 						  bool *_alert_userspace)
853*4882a593Smuzhiyun {
854*4882a593Smuzhiyun 	unsigned int irq1, mask1, mask2;
855*4882a593Smuzhiyun 	struct device *dev = &info->client->dev;
856*4882a593Smuzhiyun 	bool is_battery_absent = false;
857*4882a593Smuzhiyun 	bool alert_userspace = false;
858*4882a593Smuzhiyun 	int ret;
859*4882a593Smuzhiyun 
860*4882a593Smuzhiyun 	ret = regmap_read(info->regmap, RT9455_REG_IRQ1, &irq1);
861*4882a593Smuzhiyun 	if (ret) {
862*4882a593Smuzhiyun 		dev_err(dev, "Failed to read IRQ1 register\n");
863*4882a593Smuzhiyun 		return ret;
864*4882a593Smuzhiyun 	}
865*4882a593Smuzhiyun 
866*4882a593Smuzhiyun 	ret = regmap_read(info->regmap, RT9455_REG_MASK1, &mask1);
867*4882a593Smuzhiyun 	if (ret) {
868*4882a593Smuzhiyun 		dev_err(dev, "Failed to read MASK1 register\n");
869*4882a593Smuzhiyun 		return ret;
870*4882a593Smuzhiyun 	}
871*4882a593Smuzhiyun 
872*4882a593Smuzhiyun 	if (irq1 & GET_MASK(F_TSDI)) {
873*4882a593Smuzhiyun 		dev_err(dev, "Thermal shutdown fault occurred\n");
874*4882a593Smuzhiyun 		alert_userspace = true;
875*4882a593Smuzhiyun 	}
876*4882a593Smuzhiyun 
877*4882a593Smuzhiyun 	if (irq1 & GET_MASK(F_VINOVPI)) {
878*4882a593Smuzhiyun 		dev_err(dev, "Overvoltage input occurred\n");
879*4882a593Smuzhiyun 		alert_userspace = true;
880*4882a593Smuzhiyun 	}
881*4882a593Smuzhiyun 
882*4882a593Smuzhiyun 	if (irq1 & GET_MASK(F_BATAB)) {
883*4882a593Smuzhiyun 		dev_err(dev, "Battery absence occurred\n");
884*4882a593Smuzhiyun 		is_battery_absent = true;
885*4882a593Smuzhiyun 		alert_userspace = true;
886*4882a593Smuzhiyun 
887*4882a593Smuzhiyun 		if ((mask1 & GET_MASK(F_BATABM)) == 0) {
888*4882a593Smuzhiyun 			ret = regmap_field_write(info->regmap_fields[F_BATABM],
889*4882a593Smuzhiyun 						 0x01);
890*4882a593Smuzhiyun 			if (ret) {
891*4882a593Smuzhiyun 				dev_err(dev, "Failed to mask BATAB interrupt\n");
892*4882a593Smuzhiyun 				return ret;
893*4882a593Smuzhiyun 			}
894*4882a593Smuzhiyun 		}
895*4882a593Smuzhiyun 
896*4882a593Smuzhiyun 		ret = regmap_read(info->regmap, RT9455_REG_MASK2, &mask2);
897*4882a593Smuzhiyun 		if (ret) {
898*4882a593Smuzhiyun 			dev_err(dev, "Failed to read MASK2 register\n");
899*4882a593Smuzhiyun 			return ret;
900*4882a593Smuzhiyun 		}
901*4882a593Smuzhiyun 
902*4882a593Smuzhiyun 		if (mask2 & GET_MASK(F_CHTERMIM)) {
903*4882a593Smuzhiyun 			ret = regmap_field_write(
904*4882a593Smuzhiyun 				info->regmap_fields[F_CHTERMIM], 0x00);
905*4882a593Smuzhiyun 			if (ret) {
906*4882a593Smuzhiyun 				dev_err(dev, "Failed to unmask CHTERMI interrupt\n");
907*4882a593Smuzhiyun 				return ret;
908*4882a593Smuzhiyun 			}
909*4882a593Smuzhiyun 		}
910*4882a593Smuzhiyun 
911*4882a593Smuzhiyun 		if (mask2 & GET_MASK(F_CHRCHGIM)) {
912*4882a593Smuzhiyun 			ret = regmap_field_write(
913*4882a593Smuzhiyun 				info->regmap_fields[F_CHRCHGIM], 0x00);
914*4882a593Smuzhiyun 			if (ret) {
915*4882a593Smuzhiyun 				dev_err(dev, "Failed to unmask CHRCHGI interrupt\n");
916*4882a593Smuzhiyun 				return ret;
917*4882a593Smuzhiyun 			}
918*4882a593Smuzhiyun 		}
919*4882a593Smuzhiyun 
920*4882a593Smuzhiyun 		/*
921*4882a593Smuzhiyun 		 * When the battery is absent, max_charging_time_work is
922*4882a593Smuzhiyun 		 * cancelled, since no charging is done.
923*4882a593Smuzhiyun 		 */
924*4882a593Smuzhiyun 		cancel_delayed_work_sync(&info->max_charging_time_work);
925*4882a593Smuzhiyun 		/*
926*4882a593Smuzhiyun 		 * Since no interrupt is triggered when the battery is
927*4882a593Smuzhiyun 		 * reconnected, max_charging_time_work is not rescheduled.
928*4882a593Smuzhiyun 		 * Therefore, batt_presence_work is scheduled to check whether
929*4882a593Smuzhiyun 		 * the battery is still absent or not.
930*4882a593Smuzhiyun 		 */
931*4882a593Smuzhiyun 		queue_delayed_work(system_power_efficient_wq,
932*4882a593Smuzhiyun 				   &info->batt_presence_work,
933*4882a593Smuzhiyun 				   RT9455_BATT_PRESENCE_DELAY * HZ);
934*4882a593Smuzhiyun 	}
935*4882a593Smuzhiyun 
936*4882a593Smuzhiyun 	*_is_battery_absent = is_battery_absent;
937*4882a593Smuzhiyun 
938*4882a593Smuzhiyun 	if (alert_userspace)
939*4882a593Smuzhiyun 		*_alert_userspace = alert_userspace;
940*4882a593Smuzhiyun 
941*4882a593Smuzhiyun 	return 0;
942*4882a593Smuzhiyun }
943*4882a593Smuzhiyun 
rt9455_irq_handler_check_irq2_register(struct rt9455_info * info,bool is_battery_absent,bool * _alert_userspace)944*4882a593Smuzhiyun static int rt9455_irq_handler_check_irq2_register(struct rt9455_info *info,
945*4882a593Smuzhiyun 						  bool is_battery_absent,
946*4882a593Smuzhiyun 						  bool *_alert_userspace)
947*4882a593Smuzhiyun {
948*4882a593Smuzhiyun 	unsigned int irq2, mask2;
949*4882a593Smuzhiyun 	struct device *dev = &info->client->dev;
950*4882a593Smuzhiyun 	bool alert_userspace = false;
951*4882a593Smuzhiyun 	int ret;
952*4882a593Smuzhiyun 
953*4882a593Smuzhiyun 	ret = regmap_read(info->regmap, RT9455_REG_IRQ2, &irq2);
954*4882a593Smuzhiyun 	if (ret) {
955*4882a593Smuzhiyun 		dev_err(dev, "Failed to read IRQ2 register\n");
956*4882a593Smuzhiyun 		return ret;
957*4882a593Smuzhiyun 	}
958*4882a593Smuzhiyun 
959*4882a593Smuzhiyun 	ret = regmap_read(info->regmap, RT9455_REG_MASK2, &mask2);
960*4882a593Smuzhiyun 	if (ret) {
961*4882a593Smuzhiyun 		dev_err(dev, "Failed to read MASK2 register\n");
962*4882a593Smuzhiyun 		return ret;
963*4882a593Smuzhiyun 	}
964*4882a593Smuzhiyun 
965*4882a593Smuzhiyun 	if (irq2 & GET_MASK(F_CHRVPI)) {
966*4882a593Smuzhiyun 		dev_dbg(dev, "Charger fault occurred\n");
967*4882a593Smuzhiyun 		/*
968*4882a593Smuzhiyun 		 * CHRVPI bit is set in 2 cases:
969*4882a593Smuzhiyun 		 * 1. when the power source is connected to the charger.
970*4882a593Smuzhiyun 		 * 2. when the power source is disconnected from the charger.
971*4882a593Smuzhiyun 		 * To identify the case, PWR_RDY bit is checked. Because
972*4882a593Smuzhiyun 		 * PWR_RDY bit is set / cleared after CHRVPI interrupt is
973*4882a593Smuzhiyun 		 * triggered, it is used delayed_work to later read PWR_RDY bit.
974*4882a593Smuzhiyun 		 * Also, do not set to true alert_userspace, because there is no
975*4882a593Smuzhiyun 		 * need to notify userspace when CHRVPI interrupt has occurred.
976*4882a593Smuzhiyun 		 * Userspace will be notified after PWR_RDY bit is read.
977*4882a593Smuzhiyun 		 */
978*4882a593Smuzhiyun 		queue_delayed_work(system_power_efficient_wq,
979*4882a593Smuzhiyun 				   &info->pwr_rdy_work,
980*4882a593Smuzhiyun 				   RT9455_PWR_RDY_DELAY * HZ);
981*4882a593Smuzhiyun 	}
982*4882a593Smuzhiyun 	if (irq2 & GET_MASK(F_CHBATOVI)) {
983*4882a593Smuzhiyun 		dev_err(dev, "Battery OVP occurred\n");
984*4882a593Smuzhiyun 		alert_userspace = true;
985*4882a593Smuzhiyun 	}
986*4882a593Smuzhiyun 	if (irq2 & GET_MASK(F_CHTERMI)) {
987*4882a593Smuzhiyun 		dev_dbg(dev, "Charge terminated\n");
988*4882a593Smuzhiyun 		if (!is_battery_absent) {
989*4882a593Smuzhiyun 			if ((mask2 & GET_MASK(F_CHTERMIM)) == 0) {
990*4882a593Smuzhiyun 				ret = regmap_field_write(
991*4882a593Smuzhiyun 					info->regmap_fields[F_CHTERMIM], 0x01);
992*4882a593Smuzhiyun 				if (ret) {
993*4882a593Smuzhiyun 					dev_err(dev, "Failed to mask CHTERMI interrupt\n");
994*4882a593Smuzhiyun 					return ret;
995*4882a593Smuzhiyun 				}
996*4882a593Smuzhiyun 				/*
997*4882a593Smuzhiyun 				 * Update MASK2 value, since CHTERMIM bit is
998*4882a593Smuzhiyun 				 * set.
999*4882a593Smuzhiyun 				 */
1000*4882a593Smuzhiyun 				mask2 = mask2 | GET_MASK(F_CHTERMIM);
1001*4882a593Smuzhiyun 			}
1002*4882a593Smuzhiyun 			cancel_delayed_work_sync(&info->max_charging_time_work);
1003*4882a593Smuzhiyun 			alert_userspace = true;
1004*4882a593Smuzhiyun 		}
1005*4882a593Smuzhiyun 	}
1006*4882a593Smuzhiyun 	if (irq2 & GET_MASK(F_CHRCHGI)) {
1007*4882a593Smuzhiyun 		dev_dbg(dev, "Recharge request\n");
1008*4882a593Smuzhiyun 		ret = regmap_field_write(info->regmap_fields[F_CHG_EN],
1009*4882a593Smuzhiyun 					 RT9455_CHARGE_ENABLE);
1010*4882a593Smuzhiyun 		if (ret) {
1011*4882a593Smuzhiyun 			dev_err(dev, "Failed to enable charging\n");
1012*4882a593Smuzhiyun 			return ret;
1013*4882a593Smuzhiyun 		}
1014*4882a593Smuzhiyun 		if (mask2 & GET_MASK(F_CHTERMIM)) {
1015*4882a593Smuzhiyun 			ret = regmap_field_write(
1016*4882a593Smuzhiyun 				info->regmap_fields[F_CHTERMIM], 0x00);
1017*4882a593Smuzhiyun 			if (ret) {
1018*4882a593Smuzhiyun 				dev_err(dev, "Failed to unmask CHTERMI interrupt\n");
1019*4882a593Smuzhiyun 				return ret;
1020*4882a593Smuzhiyun 			}
1021*4882a593Smuzhiyun 			/* Update MASK2 value, since CHTERMIM bit is cleared. */
1022*4882a593Smuzhiyun 			mask2 = mask2 & ~GET_MASK(F_CHTERMIM);
1023*4882a593Smuzhiyun 		}
1024*4882a593Smuzhiyun 		if (!is_battery_absent) {
1025*4882a593Smuzhiyun 			/*
1026*4882a593Smuzhiyun 			 * No need to check whether the charger is connected to
1027*4882a593Smuzhiyun 			 * power source when CHRCHGI is received, since CHRCHGI
1028*4882a593Smuzhiyun 			 * is not triggered if the charger is not connected to
1029*4882a593Smuzhiyun 			 * the power source.
1030*4882a593Smuzhiyun 			 */
1031*4882a593Smuzhiyun 			queue_delayed_work(system_power_efficient_wq,
1032*4882a593Smuzhiyun 					   &info->max_charging_time_work,
1033*4882a593Smuzhiyun 					   RT9455_MAX_CHARGING_TIME * HZ);
1034*4882a593Smuzhiyun 			alert_userspace = true;
1035*4882a593Smuzhiyun 		}
1036*4882a593Smuzhiyun 	}
1037*4882a593Smuzhiyun 	if (irq2 & GET_MASK(F_CH32MI)) {
1038*4882a593Smuzhiyun 		dev_err(dev, "Charger fault. 32 mins timeout occurred\n");
1039*4882a593Smuzhiyun 		alert_userspace = true;
1040*4882a593Smuzhiyun 	}
1041*4882a593Smuzhiyun 	if (irq2 & GET_MASK(F_CHTREGI)) {
1042*4882a593Smuzhiyun 		dev_warn(dev,
1043*4882a593Smuzhiyun 			 "Charger warning. Thermal regulation loop active\n");
1044*4882a593Smuzhiyun 		alert_userspace = true;
1045*4882a593Smuzhiyun 	}
1046*4882a593Smuzhiyun 	if (irq2 & GET_MASK(F_CHMIVRI)) {
1047*4882a593Smuzhiyun 		dev_dbg(dev,
1048*4882a593Smuzhiyun 			"Charger warning. Input voltage MIVR loop active\n");
1049*4882a593Smuzhiyun 	}
1050*4882a593Smuzhiyun 
1051*4882a593Smuzhiyun 	if (alert_userspace)
1052*4882a593Smuzhiyun 		*_alert_userspace = alert_userspace;
1053*4882a593Smuzhiyun 
1054*4882a593Smuzhiyun 	return 0;
1055*4882a593Smuzhiyun }
1056*4882a593Smuzhiyun 
rt9455_irq_handler_check_irq3_register(struct rt9455_info * info,bool * _alert_userspace)1057*4882a593Smuzhiyun static int rt9455_irq_handler_check_irq3_register(struct rt9455_info *info,
1058*4882a593Smuzhiyun 						  bool *_alert_userspace)
1059*4882a593Smuzhiyun {
1060*4882a593Smuzhiyun 	unsigned int irq3, mask3;
1061*4882a593Smuzhiyun 	struct device *dev = &info->client->dev;
1062*4882a593Smuzhiyun 	bool alert_userspace = false;
1063*4882a593Smuzhiyun 	int ret;
1064*4882a593Smuzhiyun 
1065*4882a593Smuzhiyun 	ret = regmap_read(info->regmap, RT9455_REG_IRQ3, &irq3);
1066*4882a593Smuzhiyun 	if (ret) {
1067*4882a593Smuzhiyun 		dev_err(dev, "Failed to read IRQ3 register\n");
1068*4882a593Smuzhiyun 		return ret;
1069*4882a593Smuzhiyun 	}
1070*4882a593Smuzhiyun 
1071*4882a593Smuzhiyun 	ret = regmap_read(info->regmap, RT9455_REG_MASK3, &mask3);
1072*4882a593Smuzhiyun 	if (ret) {
1073*4882a593Smuzhiyun 		dev_err(dev, "Failed to read MASK3 register\n");
1074*4882a593Smuzhiyun 		return ret;
1075*4882a593Smuzhiyun 	}
1076*4882a593Smuzhiyun 
1077*4882a593Smuzhiyun 	if (irq3 & GET_MASK(F_BSTBUSOVI)) {
1078*4882a593Smuzhiyun 		dev_err(dev, "Boost fault. Overvoltage input occurred\n");
1079*4882a593Smuzhiyun 		alert_userspace = true;
1080*4882a593Smuzhiyun 	}
1081*4882a593Smuzhiyun 	if (irq3 & GET_MASK(F_BSTOLI)) {
1082*4882a593Smuzhiyun 		dev_err(dev, "Boost fault. Overload\n");
1083*4882a593Smuzhiyun 		alert_userspace = true;
1084*4882a593Smuzhiyun 	}
1085*4882a593Smuzhiyun 	if (irq3 & GET_MASK(F_BSTLOWVI)) {
1086*4882a593Smuzhiyun 		dev_err(dev, "Boost fault. Battery voltage too low\n");
1087*4882a593Smuzhiyun 		alert_userspace = true;
1088*4882a593Smuzhiyun 	}
1089*4882a593Smuzhiyun 	if (irq3 & GET_MASK(F_BST32SI)) {
1090*4882a593Smuzhiyun 		dev_err(dev, "Boost fault. 32 seconds timeout occurred.\n");
1091*4882a593Smuzhiyun 		alert_userspace = true;
1092*4882a593Smuzhiyun 	}
1093*4882a593Smuzhiyun 
1094*4882a593Smuzhiyun 	if (alert_userspace) {
1095*4882a593Smuzhiyun 		dev_info(dev, "Boost fault occurred, therefore the charger goes into charge mode\n");
1096*4882a593Smuzhiyun 		ret = rt9455_set_voreg_before_charge_mode(info);
1097*4882a593Smuzhiyun 		if (ret) {
1098*4882a593Smuzhiyun 			dev_err(dev, "Failed to set VOREG before entering charge mode\n");
1099*4882a593Smuzhiyun 			return ret;
1100*4882a593Smuzhiyun 		}
1101*4882a593Smuzhiyun 		ret = regmap_field_write(info->regmap_fields[F_OPA_MODE],
1102*4882a593Smuzhiyun 					 RT9455_CHARGE_MODE);
1103*4882a593Smuzhiyun 		if (ret) {
1104*4882a593Smuzhiyun 			dev_err(dev, "Failed to set charger in charge mode\n");
1105*4882a593Smuzhiyun 			return ret;
1106*4882a593Smuzhiyun 		}
1107*4882a593Smuzhiyun 		*_alert_userspace = alert_userspace;
1108*4882a593Smuzhiyun 	}
1109*4882a593Smuzhiyun 
1110*4882a593Smuzhiyun 	return 0;
1111*4882a593Smuzhiyun }
1112*4882a593Smuzhiyun 
rt9455_irq_handler_thread(int irq,void * data)1113*4882a593Smuzhiyun static irqreturn_t rt9455_irq_handler_thread(int irq, void *data)
1114*4882a593Smuzhiyun {
1115*4882a593Smuzhiyun 	struct rt9455_info *info = data;
1116*4882a593Smuzhiyun 	struct device *dev;
1117*4882a593Smuzhiyun 	bool alert_userspace = false;
1118*4882a593Smuzhiyun 	bool is_battery_absent = false;
1119*4882a593Smuzhiyun 	unsigned int status;
1120*4882a593Smuzhiyun 	int ret;
1121*4882a593Smuzhiyun 
1122*4882a593Smuzhiyun 	if (!info)
1123*4882a593Smuzhiyun 		return IRQ_NONE;
1124*4882a593Smuzhiyun 
1125*4882a593Smuzhiyun 	dev = &info->client->dev;
1126*4882a593Smuzhiyun 
1127*4882a593Smuzhiyun 	if (irq != info->client->irq) {
1128*4882a593Smuzhiyun 		dev_err(dev, "Interrupt is not for RT9455 charger\n");
1129*4882a593Smuzhiyun 		return IRQ_NONE;
1130*4882a593Smuzhiyun 	}
1131*4882a593Smuzhiyun 
1132*4882a593Smuzhiyun 	ret = regmap_field_read(info->regmap_fields[F_STAT], &status);
1133*4882a593Smuzhiyun 	if (ret) {
1134*4882a593Smuzhiyun 		dev_err(dev, "Failed to read STAT bits\n");
1135*4882a593Smuzhiyun 		return IRQ_HANDLED;
1136*4882a593Smuzhiyun 	}
1137*4882a593Smuzhiyun 	dev_dbg(dev, "Charger status is %d\n", status);
1138*4882a593Smuzhiyun 
1139*4882a593Smuzhiyun 	/*
1140*4882a593Smuzhiyun 	 * Each function that processes an IRQ register receives as output
1141*4882a593Smuzhiyun 	 * parameter alert_userspace pointer. alert_userspace is set to true
1142*4882a593Smuzhiyun 	 * in such a function only if an interrupt has occurred in the
1143*4882a593Smuzhiyun 	 * respective interrupt register. This way, it is avoided the following
1144*4882a593Smuzhiyun 	 * case: interrupt occurs only in IRQ1 register,
1145*4882a593Smuzhiyun 	 * rt9455_irq_handler_check_irq1_register() function sets to true
1146*4882a593Smuzhiyun 	 * alert_userspace, but rt9455_irq_handler_check_irq2_register()
1147*4882a593Smuzhiyun 	 * and rt9455_irq_handler_check_irq3_register() functions set to false
1148*4882a593Smuzhiyun 	 * alert_userspace and power_supply_changed() is never called.
1149*4882a593Smuzhiyun 	 */
1150*4882a593Smuzhiyun 	ret = rt9455_irq_handler_check_irq1_register(info, &is_battery_absent,
1151*4882a593Smuzhiyun 						     &alert_userspace);
1152*4882a593Smuzhiyun 	if (ret) {
1153*4882a593Smuzhiyun 		dev_err(dev, "Failed to handle IRQ1 register\n");
1154*4882a593Smuzhiyun 		return IRQ_HANDLED;
1155*4882a593Smuzhiyun 	}
1156*4882a593Smuzhiyun 
1157*4882a593Smuzhiyun 	ret = rt9455_irq_handler_check_irq2_register(info, is_battery_absent,
1158*4882a593Smuzhiyun 						     &alert_userspace);
1159*4882a593Smuzhiyun 	if (ret) {
1160*4882a593Smuzhiyun 		dev_err(dev, "Failed to handle IRQ2 register\n");
1161*4882a593Smuzhiyun 		return IRQ_HANDLED;
1162*4882a593Smuzhiyun 	}
1163*4882a593Smuzhiyun 
1164*4882a593Smuzhiyun 	ret = rt9455_irq_handler_check_irq3_register(info, &alert_userspace);
1165*4882a593Smuzhiyun 	if (ret) {
1166*4882a593Smuzhiyun 		dev_err(dev, "Failed to handle IRQ3 register\n");
1167*4882a593Smuzhiyun 		return IRQ_HANDLED;
1168*4882a593Smuzhiyun 	}
1169*4882a593Smuzhiyun 
1170*4882a593Smuzhiyun 	if (alert_userspace) {
1171*4882a593Smuzhiyun 		/*
1172*4882a593Smuzhiyun 		 * Sometimes, an interrupt occurs while rt9455_probe() function
1173*4882a593Smuzhiyun 		 * is executing and power_supply_register() is not yet called.
1174*4882a593Smuzhiyun 		 * Do not call power_supply_changed() in this case.
1175*4882a593Smuzhiyun 		 */
1176*4882a593Smuzhiyun 		if (info->charger)
1177*4882a593Smuzhiyun 			power_supply_changed(info->charger);
1178*4882a593Smuzhiyun 	}
1179*4882a593Smuzhiyun 
1180*4882a593Smuzhiyun 	return IRQ_HANDLED;
1181*4882a593Smuzhiyun }
1182*4882a593Smuzhiyun 
rt9455_discover_charger(struct rt9455_info * info,u32 * ichrg,u32 * ieoc_percentage,u32 * mivr,u32 * iaicr)1183*4882a593Smuzhiyun static int rt9455_discover_charger(struct rt9455_info *info, u32 *ichrg,
1184*4882a593Smuzhiyun 				   u32 *ieoc_percentage,
1185*4882a593Smuzhiyun 				   u32 *mivr, u32 *iaicr)
1186*4882a593Smuzhiyun {
1187*4882a593Smuzhiyun 	struct device *dev = &info->client->dev;
1188*4882a593Smuzhiyun 	int ret;
1189*4882a593Smuzhiyun 
1190*4882a593Smuzhiyun 	if (!dev->of_node && !ACPI_HANDLE(dev)) {
1191*4882a593Smuzhiyun 		dev_err(dev, "No support for either device tree or ACPI\n");
1192*4882a593Smuzhiyun 		return -EINVAL;
1193*4882a593Smuzhiyun 	}
1194*4882a593Smuzhiyun 	/*
1195*4882a593Smuzhiyun 	 * ICHRG, IEOC_PERCENTAGE, VOREG and boost output voltage are mandatory
1196*4882a593Smuzhiyun 	 * parameters.
1197*4882a593Smuzhiyun 	 */
1198*4882a593Smuzhiyun 	ret = device_property_read_u32(dev, "richtek,output-charge-current",
1199*4882a593Smuzhiyun 				       ichrg);
1200*4882a593Smuzhiyun 	if (ret) {
1201*4882a593Smuzhiyun 		dev_err(dev, "Error: missing \"output-charge-current\" property\n");
1202*4882a593Smuzhiyun 		return ret;
1203*4882a593Smuzhiyun 	}
1204*4882a593Smuzhiyun 
1205*4882a593Smuzhiyun 	ret = device_property_read_u32(dev, "richtek,end-of-charge-percentage",
1206*4882a593Smuzhiyun 				       ieoc_percentage);
1207*4882a593Smuzhiyun 	if (ret) {
1208*4882a593Smuzhiyun 		dev_err(dev, "Error: missing \"end-of-charge-percentage\" property\n");
1209*4882a593Smuzhiyun 		return ret;
1210*4882a593Smuzhiyun 	}
1211*4882a593Smuzhiyun 
1212*4882a593Smuzhiyun 	ret = device_property_read_u32(dev,
1213*4882a593Smuzhiyun 				       "richtek,battery-regulation-voltage",
1214*4882a593Smuzhiyun 				       &info->voreg);
1215*4882a593Smuzhiyun 	if (ret) {
1216*4882a593Smuzhiyun 		dev_err(dev, "Error: missing \"battery-regulation-voltage\" property\n");
1217*4882a593Smuzhiyun 		return ret;
1218*4882a593Smuzhiyun 	}
1219*4882a593Smuzhiyun 
1220*4882a593Smuzhiyun 	ret = device_property_read_u32(dev, "richtek,boost-output-voltage",
1221*4882a593Smuzhiyun 				       &info->boost_voltage);
1222*4882a593Smuzhiyun 	if (ret) {
1223*4882a593Smuzhiyun 		dev_err(dev, "Error: missing \"boost-output-voltage\" property\n");
1224*4882a593Smuzhiyun 		return ret;
1225*4882a593Smuzhiyun 	}
1226*4882a593Smuzhiyun 
1227*4882a593Smuzhiyun 	/*
1228*4882a593Smuzhiyun 	 * MIVR and IAICR are optional parameters. Do not return error if one of
1229*4882a593Smuzhiyun 	 * them is not present in ACPI table or device tree specification.
1230*4882a593Smuzhiyun 	 */
1231*4882a593Smuzhiyun 	device_property_read_u32(dev, "richtek,min-input-voltage-regulation",
1232*4882a593Smuzhiyun 				 mivr);
1233*4882a593Smuzhiyun 	device_property_read_u32(dev, "richtek,avg-input-current-regulation",
1234*4882a593Smuzhiyun 				 iaicr);
1235*4882a593Smuzhiyun 
1236*4882a593Smuzhiyun 	return 0;
1237*4882a593Smuzhiyun }
1238*4882a593Smuzhiyun 
1239*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_USB_PHY)
rt9455_usb_event_none(struct rt9455_info * info,u8 opa_mode,u8 iaicr)1240*4882a593Smuzhiyun static int rt9455_usb_event_none(struct rt9455_info *info,
1241*4882a593Smuzhiyun 				 u8 opa_mode, u8 iaicr)
1242*4882a593Smuzhiyun {
1243*4882a593Smuzhiyun 	struct device *dev = &info->client->dev;
1244*4882a593Smuzhiyun 	int ret;
1245*4882a593Smuzhiyun 
1246*4882a593Smuzhiyun 	if (opa_mode == RT9455_BOOST_MODE) {
1247*4882a593Smuzhiyun 		ret = rt9455_set_voreg_before_charge_mode(info);
1248*4882a593Smuzhiyun 		if (ret) {
1249*4882a593Smuzhiyun 			dev_err(dev, "Failed to set VOREG before entering charge mode\n");
1250*4882a593Smuzhiyun 			return ret;
1251*4882a593Smuzhiyun 		}
1252*4882a593Smuzhiyun 		/*
1253*4882a593Smuzhiyun 		 * If the charger is in boost mode, and it has received
1254*4882a593Smuzhiyun 		 * USB_EVENT_NONE, this means the consumer device powered by the
1255*4882a593Smuzhiyun 		 * charger is not connected anymore.
1256*4882a593Smuzhiyun 		 * In this case, the charger goes into charge mode.
1257*4882a593Smuzhiyun 		 */
1258*4882a593Smuzhiyun 		dev_dbg(dev, "USB_EVENT_NONE received, therefore the charger goes into charge mode\n");
1259*4882a593Smuzhiyun 		ret = regmap_field_write(info->regmap_fields[F_OPA_MODE],
1260*4882a593Smuzhiyun 					 RT9455_CHARGE_MODE);
1261*4882a593Smuzhiyun 		if (ret) {
1262*4882a593Smuzhiyun 			dev_err(dev, "Failed to set charger in charge mode\n");
1263*4882a593Smuzhiyun 			return NOTIFY_DONE;
1264*4882a593Smuzhiyun 		}
1265*4882a593Smuzhiyun 	}
1266*4882a593Smuzhiyun 
1267*4882a593Smuzhiyun 	dev_dbg(dev, "USB_EVENT_NONE received, therefore IAICR is set to its minimum value\n");
1268*4882a593Smuzhiyun 	if (iaicr != RT9455_IAICR_100MA) {
1269*4882a593Smuzhiyun 		ret = regmap_field_write(info->regmap_fields[F_IAICR],
1270*4882a593Smuzhiyun 					 RT9455_IAICR_100MA);
1271*4882a593Smuzhiyun 		if (ret) {
1272*4882a593Smuzhiyun 			dev_err(dev, "Failed to set IAICR value\n");
1273*4882a593Smuzhiyun 			return NOTIFY_DONE;
1274*4882a593Smuzhiyun 		}
1275*4882a593Smuzhiyun 	}
1276*4882a593Smuzhiyun 
1277*4882a593Smuzhiyun 	return NOTIFY_OK;
1278*4882a593Smuzhiyun }
1279*4882a593Smuzhiyun 
rt9455_usb_event_vbus(struct rt9455_info * info,u8 opa_mode,u8 iaicr)1280*4882a593Smuzhiyun static int rt9455_usb_event_vbus(struct rt9455_info *info,
1281*4882a593Smuzhiyun 				 u8 opa_mode, u8 iaicr)
1282*4882a593Smuzhiyun {
1283*4882a593Smuzhiyun 	struct device *dev = &info->client->dev;
1284*4882a593Smuzhiyun 	int ret;
1285*4882a593Smuzhiyun 
1286*4882a593Smuzhiyun 	if (opa_mode == RT9455_BOOST_MODE) {
1287*4882a593Smuzhiyun 		ret = rt9455_set_voreg_before_charge_mode(info);
1288*4882a593Smuzhiyun 		if (ret) {
1289*4882a593Smuzhiyun 			dev_err(dev, "Failed to set VOREG before entering charge mode\n");
1290*4882a593Smuzhiyun 			return ret;
1291*4882a593Smuzhiyun 		}
1292*4882a593Smuzhiyun 		/*
1293*4882a593Smuzhiyun 		 * If the charger is in boost mode, and it has received
1294*4882a593Smuzhiyun 		 * USB_EVENT_VBUS, this means the consumer device powered by the
1295*4882a593Smuzhiyun 		 * charger is not connected anymore.
1296*4882a593Smuzhiyun 		 * In this case, the charger goes into charge mode.
1297*4882a593Smuzhiyun 		 */
1298*4882a593Smuzhiyun 		dev_dbg(dev, "USB_EVENT_VBUS received, therefore the charger goes into charge mode\n");
1299*4882a593Smuzhiyun 		ret = regmap_field_write(info->regmap_fields[F_OPA_MODE],
1300*4882a593Smuzhiyun 					 RT9455_CHARGE_MODE);
1301*4882a593Smuzhiyun 		if (ret) {
1302*4882a593Smuzhiyun 			dev_err(dev, "Failed to set charger in charge mode\n");
1303*4882a593Smuzhiyun 			return NOTIFY_DONE;
1304*4882a593Smuzhiyun 		}
1305*4882a593Smuzhiyun 	}
1306*4882a593Smuzhiyun 
1307*4882a593Smuzhiyun 	dev_dbg(dev, "USB_EVENT_VBUS received, therefore IAICR is set to 500 mA\n");
1308*4882a593Smuzhiyun 	if (iaicr != RT9455_IAICR_500MA) {
1309*4882a593Smuzhiyun 		ret = regmap_field_write(info->regmap_fields[F_IAICR],
1310*4882a593Smuzhiyun 					 RT9455_IAICR_500MA);
1311*4882a593Smuzhiyun 		if (ret) {
1312*4882a593Smuzhiyun 			dev_err(dev, "Failed to set IAICR value\n");
1313*4882a593Smuzhiyun 			return NOTIFY_DONE;
1314*4882a593Smuzhiyun 		}
1315*4882a593Smuzhiyun 	}
1316*4882a593Smuzhiyun 
1317*4882a593Smuzhiyun 	return NOTIFY_OK;
1318*4882a593Smuzhiyun }
1319*4882a593Smuzhiyun 
rt9455_usb_event_id(struct rt9455_info * info,u8 opa_mode,u8 iaicr)1320*4882a593Smuzhiyun static int rt9455_usb_event_id(struct rt9455_info *info,
1321*4882a593Smuzhiyun 			       u8 opa_mode, u8 iaicr)
1322*4882a593Smuzhiyun {
1323*4882a593Smuzhiyun 	struct device *dev = &info->client->dev;
1324*4882a593Smuzhiyun 	int ret;
1325*4882a593Smuzhiyun 
1326*4882a593Smuzhiyun 	if (opa_mode == RT9455_CHARGE_MODE) {
1327*4882a593Smuzhiyun 		ret = rt9455_set_boost_voltage_before_boost_mode(info);
1328*4882a593Smuzhiyun 		if (ret) {
1329*4882a593Smuzhiyun 			dev_err(dev, "Failed to set boost output voltage before entering boost mode\n");
1330*4882a593Smuzhiyun 			return ret;
1331*4882a593Smuzhiyun 		}
1332*4882a593Smuzhiyun 		/*
1333*4882a593Smuzhiyun 		 * If the charger is in charge mode, and it has received
1334*4882a593Smuzhiyun 		 * USB_EVENT_ID, this means a consumer device is connected and
1335*4882a593Smuzhiyun 		 * it should be powered by the charger.
1336*4882a593Smuzhiyun 		 * In this case, the charger goes into boost mode.
1337*4882a593Smuzhiyun 		 */
1338*4882a593Smuzhiyun 		dev_dbg(dev, "USB_EVENT_ID received, therefore the charger goes into boost mode\n");
1339*4882a593Smuzhiyun 		ret = regmap_field_write(info->regmap_fields[F_OPA_MODE],
1340*4882a593Smuzhiyun 					 RT9455_BOOST_MODE);
1341*4882a593Smuzhiyun 		if (ret) {
1342*4882a593Smuzhiyun 			dev_err(dev, "Failed to set charger in boost mode\n");
1343*4882a593Smuzhiyun 			return NOTIFY_DONE;
1344*4882a593Smuzhiyun 		}
1345*4882a593Smuzhiyun 	}
1346*4882a593Smuzhiyun 
1347*4882a593Smuzhiyun 	dev_dbg(dev, "USB_EVENT_ID received, therefore IAICR is set to its minimum value\n");
1348*4882a593Smuzhiyun 	if (iaicr != RT9455_IAICR_100MA) {
1349*4882a593Smuzhiyun 		ret = regmap_field_write(info->regmap_fields[F_IAICR],
1350*4882a593Smuzhiyun 					 RT9455_IAICR_100MA);
1351*4882a593Smuzhiyun 		if (ret) {
1352*4882a593Smuzhiyun 			dev_err(dev, "Failed to set IAICR value\n");
1353*4882a593Smuzhiyun 			return NOTIFY_DONE;
1354*4882a593Smuzhiyun 		}
1355*4882a593Smuzhiyun 	}
1356*4882a593Smuzhiyun 
1357*4882a593Smuzhiyun 	return NOTIFY_OK;
1358*4882a593Smuzhiyun }
1359*4882a593Smuzhiyun 
rt9455_usb_event_charger(struct rt9455_info * info,u8 opa_mode,u8 iaicr)1360*4882a593Smuzhiyun static int rt9455_usb_event_charger(struct rt9455_info *info,
1361*4882a593Smuzhiyun 				    u8 opa_mode, u8 iaicr)
1362*4882a593Smuzhiyun {
1363*4882a593Smuzhiyun 	struct device *dev = &info->client->dev;
1364*4882a593Smuzhiyun 	int ret;
1365*4882a593Smuzhiyun 
1366*4882a593Smuzhiyun 	if (opa_mode == RT9455_BOOST_MODE) {
1367*4882a593Smuzhiyun 		ret = rt9455_set_voreg_before_charge_mode(info);
1368*4882a593Smuzhiyun 		if (ret) {
1369*4882a593Smuzhiyun 			dev_err(dev, "Failed to set VOREG before entering charge mode\n");
1370*4882a593Smuzhiyun 			return ret;
1371*4882a593Smuzhiyun 		}
1372*4882a593Smuzhiyun 		/*
1373*4882a593Smuzhiyun 		 * If the charger is in boost mode, and it has received
1374*4882a593Smuzhiyun 		 * USB_EVENT_CHARGER, this means the consumer device powered by
1375*4882a593Smuzhiyun 		 * the charger is not connected anymore.
1376*4882a593Smuzhiyun 		 * In this case, the charger goes into charge mode.
1377*4882a593Smuzhiyun 		 */
1378*4882a593Smuzhiyun 		dev_dbg(dev, "USB_EVENT_CHARGER received, therefore the charger goes into charge mode\n");
1379*4882a593Smuzhiyun 		ret = regmap_field_write(info->regmap_fields[F_OPA_MODE],
1380*4882a593Smuzhiyun 					 RT9455_CHARGE_MODE);
1381*4882a593Smuzhiyun 		if (ret) {
1382*4882a593Smuzhiyun 			dev_err(dev, "Failed to set charger in charge mode\n");
1383*4882a593Smuzhiyun 			return NOTIFY_DONE;
1384*4882a593Smuzhiyun 		}
1385*4882a593Smuzhiyun 	}
1386*4882a593Smuzhiyun 
1387*4882a593Smuzhiyun 	dev_dbg(dev, "USB_EVENT_CHARGER received, therefore IAICR is set to no current limit\n");
1388*4882a593Smuzhiyun 	if (iaicr != RT9455_IAICR_NO_LIMIT) {
1389*4882a593Smuzhiyun 		ret = regmap_field_write(info->regmap_fields[F_IAICR],
1390*4882a593Smuzhiyun 					 RT9455_IAICR_NO_LIMIT);
1391*4882a593Smuzhiyun 		if (ret) {
1392*4882a593Smuzhiyun 			dev_err(dev, "Failed to set IAICR value\n");
1393*4882a593Smuzhiyun 			return NOTIFY_DONE;
1394*4882a593Smuzhiyun 		}
1395*4882a593Smuzhiyun 	}
1396*4882a593Smuzhiyun 
1397*4882a593Smuzhiyun 	return NOTIFY_OK;
1398*4882a593Smuzhiyun }
1399*4882a593Smuzhiyun 
rt9455_usb_event(struct notifier_block * nb,unsigned long event,void * power)1400*4882a593Smuzhiyun static int rt9455_usb_event(struct notifier_block *nb,
1401*4882a593Smuzhiyun 			    unsigned long event, void *power)
1402*4882a593Smuzhiyun {
1403*4882a593Smuzhiyun 	struct rt9455_info *info = container_of(nb, struct rt9455_info, nb);
1404*4882a593Smuzhiyun 	struct device *dev = &info->client->dev;
1405*4882a593Smuzhiyun 	unsigned int opa_mode, iaicr;
1406*4882a593Smuzhiyun 	int ret;
1407*4882a593Smuzhiyun 
1408*4882a593Smuzhiyun 	/*
1409*4882a593Smuzhiyun 	 * Determine whether the charger is in charge mode
1410*4882a593Smuzhiyun 	 * or in boost mode.
1411*4882a593Smuzhiyun 	 */
1412*4882a593Smuzhiyun 	ret = regmap_field_read(info->regmap_fields[F_OPA_MODE],
1413*4882a593Smuzhiyun 				&opa_mode);
1414*4882a593Smuzhiyun 	if (ret) {
1415*4882a593Smuzhiyun 		dev_err(dev, "Failed to read OPA_MODE value\n");
1416*4882a593Smuzhiyun 		return NOTIFY_DONE;
1417*4882a593Smuzhiyun 	}
1418*4882a593Smuzhiyun 
1419*4882a593Smuzhiyun 	ret = regmap_field_read(info->regmap_fields[F_IAICR],
1420*4882a593Smuzhiyun 				&iaicr);
1421*4882a593Smuzhiyun 	if (ret) {
1422*4882a593Smuzhiyun 		dev_err(dev, "Failed to read IAICR value\n");
1423*4882a593Smuzhiyun 		return NOTIFY_DONE;
1424*4882a593Smuzhiyun 	}
1425*4882a593Smuzhiyun 
1426*4882a593Smuzhiyun 	dev_dbg(dev, "Received USB event %lu\n", event);
1427*4882a593Smuzhiyun 	switch (event) {
1428*4882a593Smuzhiyun 	case USB_EVENT_NONE:
1429*4882a593Smuzhiyun 		return rt9455_usb_event_none(info, opa_mode, iaicr);
1430*4882a593Smuzhiyun 	case USB_EVENT_VBUS:
1431*4882a593Smuzhiyun 		return rt9455_usb_event_vbus(info, opa_mode, iaicr);
1432*4882a593Smuzhiyun 	case USB_EVENT_ID:
1433*4882a593Smuzhiyun 		return rt9455_usb_event_id(info, opa_mode, iaicr);
1434*4882a593Smuzhiyun 	case USB_EVENT_CHARGER:
1435*4882a593Smuzhiyun 		return rt9455_usb_event_charger(info, opa_mode, iaicr);
1436*4882a593Smuzhiyun 	default:
1437*4882a593Smuzhiyun 		dev_err(dev, "Unknown USB event\n");
1438*4882a593Smuzhiyun 	}
1439*4882a593Smuzhiyun 	return NOTIFY_DONE;
1440*4882a593Smuzhiyun }
1441*4882a593Smuzhiyun #endif
1442*4882a593Smuzhiyun 
rt9455_pwr_rdy_work_callback(struct work_struct * work)1443*4882a593Smuzhiyun static void rt9455_pwr_rdy_work_callback(struct work_struct *work)
1444*4882a593Smuzhiyun {
1445*4882a593Smuzhiyun 	struct rt9455_info *info = container_of(work, struct rt9455_info,
1446*4882a593Smuzhiyun 						pwr_rdy_work.work);
1447*4882a593Smuzhiyun 	struct device *dev = &info->client->dev;
1448*4882a593Smuzhiyun 	unsigned int pwr_rdy;
1449*4882a593Smuzhiyun 	int ret;
1450*4882a593Smuzhiyun 
1451*4882a593Smuzhiyun 	ret = regmap_field_read(info->regmap_fields[F_PWR_RDY], &pwr_rdy);
1452*4882a593Smuzhiyun 	if (ret) {
1453*4882a593Smuzhiyun 		dev_err(dev, "Failed to read PWR_RDY bit\n");
1454*4882a593Smuzhiyun 		return;
1455*4882a593Smuzhiyun 	}
1456*4882a593Smuzhiyun 	switch (pwr_rdy) {
1457*4882a593Smuzhiyun 	case RT9455_PWR_FAULT:
1458*4882a593Smuzhiyun 		dev_dbg(dev, "Charger disconnected from power source\n");
1459*4882a593Smuzhiyun 		cancel_delayed_work_sync(&info->max_charging_time_work);
1460*4882a593Smuzhiyun 		break;
1461*4882a593Smuzhiyun 	case RT9455_PWR_GOOD:
1462*4882a593Smuzhiyun 		dev_dbg(dev, "Charger connected to power source\n");
1463*4882a593Smuzhiyun 		ret = regmap_field_write(info->regmap_fields[F_CHG_EN],
1464*4882a593Smuzhiyun 					 RT9455_CHARGE_ENABLE);
1465*4882a593Smuzhiyun 		if (ret) {
1466*4882a593Smuzhiyun 			dev_err(dev, "Failed to enable charging\n");
1467*4882a593Smuzhiyun 			return;
1468*4882a593Smuzhiyun 		}
1469*4882a593Smuzhiyun 		queue_delayed_work(system_power_efficient_wq,
1470*4882a593Smuzhiyun 				   &info->max_charging_time_work,
1471*4882a593Smuzhiyun 				   RT9455_MAX_CHARGING_TIME * HZ);
1472*4882a593Smuzhiyun 		break;
1473*4882a593Smuzhiyun 	}
1474*4882a593Smuzhiyun 	/*
1475*4882a593Smuzhiyun 	 * Notify userspace that the charger has been either connected to or
1476*4882a593Smuzhiyun 	 * disconnected from the power source.
1477*4882a593Smuzhiyun 	 */
1478*4882a593Smuzhiyun 	power_supply_changed(info->charger);
1479*4882a593Smuzhiyun }
1480*4882a593Smuzhiyun 
rt9455_max_charging_time_work_callback(struct work_struct * work)1481*4882a593Smuzhiyun static void rt9455_max_charging_time_work_callback(struct work_struct *work)
1482*4882a593Smuzhiyun {
1483*4882a593Smuzhiyun 	struct rt9455_info *info = container_of(work, struct rt9455_info,
1484*4882a593Smuzhiyun 						max_charging_time_work.work);
1485*4882a593Smuzhiyun 	struct device *dev = &info->client->dev;
1486*4882a593Smuzhiyun 	int ret;
1487*4882a593Smuzhiyun 
1488*4882a593Smuzhiyun 	dev_err(dev, "Battery has been charging for at least 6 hours and is not yet fully charged. Battery is dead, therefore charging is disabled.\n");
1489*4882a593Smuzhiyun 	ret = regmap_field_write(info->regmap_fields[F_CHG_EN],
1490*4882a593Smuzhiyun 				 RT9455_CHARGE_DISABLE);
1491*4882a593Smuzhiyun 	if (ret)
1492*4882a593Smuzhiyun 		dev_err(dev, "Failed to disable charging\n");
1493*4882a593Smuzhiyun }
1494*4882a593Smuzhiyun 
rt9455_batt_presence_work_callback(struct work_struct * work)1495*4882a593Smuzhiyun static void rt9455_batt_presence_work_callback(struct work_struct *work)
1496*4882a593Smuzhiyun {
1497*4882a593Smuzhiyun 	struct rt9455_info *info = container_of(work, struct rt9455_info,
1498*4882a593Smuzhiyun 						batt_presence_work.work);
1499*4882a593Smuzhiyun 	struct device *dev = &info->client->dev;
1500*4882a593Smuzhiyun 	unsigned int irq1, mask1;
1501*4882a593Smuzhiyun 	int ret;
1502*4882a593Smuzhiyun 
1503*4882a593Smuzhiyun 	ret = regmap_read(info->regmap, RT9455_REG_IRQ1, &irq1);
1504*4882a593Smuzhiyun 	if (ret) {
1505*4882a593Smuzhiyun 		dev_err(dev, "Failed to read IRQ1 register\n");
1506*4882a593Smuzhiyun 		return;
1507*4882a593Smuzhiyun 	}
1508*4882a593Smuzhiyun 
1509*4882a593Smuzhiyun 	/*
1510*4882a593Smuzhiyun 	 * If the battery is still absent, batt_presence_work is rescheduled.
1511*4882a593Smuzhiyun 	 * Otherwise, max_charging_time is scheduled.
1512*4882a593Smuzhiyun 	 */
1513*4882a593Smuzhiyun 	if (irq1 & GET_MASK(F_BATAB)) {
1514*4882a593Smuzhiyun 		queue_delayed_work(system_power_efficient_wq,
1515*4882a593Smuzhiyun 				   &info->batt_presence_work,
1516*4882a593Smuzhiyun 				   RT9455_BATT_PRESENCE_DELAY * HZ);
1517*4882a593Smuzhiyun 	} else {
1518*4882a593Smuzhiyun 		queue_delayed_work(system_power_efficient_wq,
1519*4882a593Smuzhiyun 				   &info->max_charging_time_work,
1520*4882a593Smuzhiyun 				   RT9455_MAX_CHARGING_TIME * HZ);
1521*4882a593Smuzhiyun 
1522*4882a593Smuzhiyun 		ret = regmap_read(info->regmap, RT9455_REG_MASK1, &mask1);
1523*4882a593Smuzhiyun 		if (ret) {
1524*4882a593Smuzhiyun 			dev_err(dev, "Failed to read MASK1 register\n");
1525*4882a593Smuzhiyun 			return;
1526*4882a593Smuzhiyun 		}
1527*4882a593Smuzhiyun 
1528*4882a593Smuzhiyun 		if (mask1 & GET_MASK(F_BATABM)) {
1529*4882a593Smuzhiyun 			ret = regmap_field_write(info->regmap_fields[F_BATABM],
1530*4882a593Smuzhiyun 						 0x00);
1531*4882a593Smuzhiyun 			if (ret)
1532*4882a593Smuzhiyun 				dev_err(dev, "Failed to unmask BATAB interrupt\n");
1533*4882a593Smuzhiyun 		}
1534*4882a593Smuzhiyun 		/*
1535*4882a593Smuzhiyun 		 * Notify userspace that the battery is now connected to the
1536*4882a593Smuzhiyun 		 * charger.
1537*4882a593Smuzhiyun 		 */
1538*4882a593Smuzhiyun 		power_supply_changed(info->charger);
1539*4882a593Smuzhiyun 	}
1540*4882a593Smuzhiyun }
1541*4882a593Smuzhiyun 
1542*4882a593Smuzhiyun static const struct power_supply_desc rt9455_charger_desc = {
1543*4882a593Smuzhiyun 	.name			= RT9455_DRIVER_NAME,
1544*4882a593Smuzhiyun 	.type			= POWER_SUPPLY_TYPE_USB,
1545*4882a593Smuzhiyun 	.properties		= rt9455_charger_properties,
1546*4882a593Smuzhiyun 	.num_properties		= ARRAY_SIZE(rt9455_charger_properties),
1547*4882a593Smuzhiyun 	.get_property		= rt9455_charger_get_property,
1548*4882a593Smuzhiyun };
1549*4882a593Smuzhiyun 
rt9455_is_writeable_reg(struct device * dev,unsigned int reg)1550*4882a593Smuzhiyun static bool rt9455_is_writeable_reg(struct device *dev, unsigned int reg)
1551*4882a593Smuzhiyun {
1552*4882a593Smuzhiyun 	switch (reg) {
1553*4882a593Smuzhiyun 	case RT9455_REG_DEV_ID:
1554*4882a593Smuzhiyun 	case RT9455_REG_IRQ1:
1555*4882a593Smuzhiyun 	case RT9455_REG_IRQ2:
1556*4882a593Smuzhiyun 	case RT9455_REG_IRQ3:
1557*4882a593Smuzhiyun 		return false;
1558*4882a593Smuzhiyun 	default:
1559*4882a593Smuzhiyun 		return true;
1560*4882a593Smuzhiyun 	}
1561*4882a593Smuzhiyun }
1562*4882a593Smuzhiyun 
rt9455_is_volatile_reg(struct device * dev,unsigned int reg)1563*4882a593Smuzhiyun static bool rt9455_is_volatile_reg(struct device *dev, unsigned int reg)
1564*4882a593Smuzhiyun {
1565*4882a593Smuzhiyun 	switch (reg) {
1566*4882a593Smuzhiyun 	case RT9455_REG_DEV_ID:
1567*4882a593Smuzhiyun 	case RT9455_REG_CTRL5:
1568*4882a593Smuzhiyun 	case RT9455_REG_CTRL6:
1569*4882a593Smuzhiyun 		return false;
1570*4882a593Smuzhiyun 	default:
1571*4882a593Smuzhiyun 		return true;
1572*4882a593Smuzhiyun 	}
1573*4882a593Smuzhiyun }
1574*4882a593Smuzhiyun 
1575*4882a593Smuzhiyun static const struct regmap_config rt9455_regmap_config = {
1576*4882a593Smuzhiyun 	.reg_bits	= 8,
1577*4882a593Smuzhiyun 	.val_bits	= 8,
1578*4882a593Smuzhiyun 	.writeable_reg	= rt9455_is_writeable_reg,
1579*4882a593Smuzhiyun 	.volatile_reg	= rt9455_is_volatile_reg,
1580*4882a593Smuzhiyun 	.max_register	= RT9455_REG_MASK3,
1581*4882a593Smuzhiyun 	.cache_type	= REGCACHE_RBTREE,
1582*4882a593Smuzhiyun };
1583*4882a593Smuzhiyun 
rt9455_probe(struct i2c_client * client,const struct i2c_device_id * id)1584*4882a593Smuzhiyun static int rt9455_probe(struct i2c_client *client,
1585*4882a593Smuzhiyun 			const struct i2c_device_id *id)
1586*4882a593Smuzhiyun {
1587*4882a593Smuzhiyun 	struct i2c_adapter *adapter = client->adapter;
1588*4882a593Smuzhiyun 	struct device *dev = &client->dev;
1589*4882a593Smuzhiyun 	struct rt9455_info *info;
1590*4882a593Smuzhiyun 	struct power_supply_config rt9455_charger_config = {};
1591*4882a593Smuzhiyun 	/*
1592*4882a593Smuzhiyun 	 * Mandatory device-specific data values. Also, VOREG and boost output
1593*4882a593Smuzhiyun 	 * voltage are mandatory values, but they are stored in rt9455_info
1594*4882a593Smuzhiyun 	 * structure.
1595*4882a593Smuzhiyun 	 */
1596*4882a593Smuzhiyun 	u32 ichrg, ieoc_percentage;
1597*4882a593Smuzhiyun 	/* Optional device-specific data values. */
1598*4882a593Smuzhiyun 	u32 mivr = -1, iaicr = -1;
1599*4882a593Smuzhiyun 	int i, ret;
1600*4882a593Smuzhiyun 
1601*4882a593Smuzhiyun 	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
1602*4882a593Smuzhiyun 		dev_err(dev, "No support for SMBUS_BYTE_DATA\n");
1603*4882a593Smuzhiyun 		return -ENODEV;
1604*4882a593Smuzhiyun 	}
1605*4882a593Smuzhiyun 	info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL);
1606*4882a593Smuzhiyun 	if (!info)
1607*4882a593Smuzhiyun 		return -ENOMEM;
1608*4882a593Smuzhiyun 
1609*4882a593Smuzhiyun 	info->client = client;
1610*4882a593Smuzhiyun 	i2c_set_clientdata(client, info);
1611*4882a593Smuzhiyun 
1612*4882a593Smuzhiyun 	info->regmap = devm_regmap_init_i2c(client,
1613*4882a593Smuzhiyun 					    &rt9455_regmap_config);
1614*4882a593Smuzhiyun 	if (IS_ERR(info->regmap)) {
1615*4882a593Smuzhiyun 		dev_err(dev, "Failed to initialize register map\n");
1616*4882a593Smuzhiyun 		return -EINVAL;
1617*4882a593Smuzhiyun 	}
1618*4882a593Smuzhiyun 
1619*4882a593Smuzhiyun 	for (i = 0; i < F_MAX_FIELDS; i++) {
1620*4882a593Smuzhiyun 		info->regmap_fields[i] =
1621*4882a593Smuzhiyun 			devm_regmap_field_alloc(dev, info->regmap,
1622*4882a593Smuzhiyun 						rt9455_reg_fields[i]);
1623*4882a593Smuzhiyun 		if (IS_ERR(info->regmap_fields[i])) {
1624*4882a593Smuzhiyun 			dev_err(dev,
1625*4882a593Smuzhiyun 				"Failed to allocate regmap field = %d\n", i);
1626*4882a593Smuzhiyun 			return PTR_ERR(info->regmap_fields[i]);
1627*4882a593Smuzhiyun 		}
1628*4882a593Smuzhiyun 	}
1629*4882a593Smuzhiyun 
1630*4882a593Smuzhiyun 	ret = rt9455_discover_charger(info, &ichrg, &ieoc_percentage,
1631*4882a593Smuzhiyun 				      &mivr, &iaicr);
1632*4882a593Smuzhiyun 	if (ret) {
1633*4882a593Smuzhiyun 		dev_err(dev, "Failed to discover charger\n");
1634*4882a593Smuzhiyun 		return ret;
1635*4882a593Smuzhiyun 	}
1636*4882a593Smuzhiyun 
1637*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_USB_PHY)
1638*4882a593Smuzhiyun 	info->usb_phy = devm_usb_get_phy(dev, USB_PHY_TYPE_USB2);
1639*4882a593Smuzhiyun 	if (IS_ERR(info->usb_phy)) {
1640*4882a593Smuzhiyun 		dev_err(dev, "Failed to get USB transceiver\n");
1641*4882a593Smuzhiyun 	} else {
1642*4882a593Smuzhiyun 		info->nb.notifier_call = rt9455_usb_event;
1643*4882a593Smuzhiyun 		ret = usb_register_notifier(info->usb_phy, &info->nb);
1644*4882a593Smuzhiyun 		if (ret) {
1645*4882a593Smuzhiyun 			dev_err(dev, "Failed to register USB notifier\n");
1646*4882a593Smuzhiyun 			/*
1647*4882a593Smuzhiyun 			 * If usb_register_notifier() fails, set notifier_call
1648*4882a593Smuzhiyun 			 * to NULL, to avoid calling usb_unregister_notifier().
1649*4882a593Smuzhiyun 			 */
1650*4882a593Smuzhiyun 			info->nb.notifier_call = NULL;
1651*4882a593Smuzhiyun 		}
1652*4882a593Smuzhiyun 	}
1653*4882a593Smuzhiyun #endif
1654*4882a593Smuzhiyun 
1655*4882a593Smuzhiyun 	INIT_DEFERRABLE_WORK(&info->pwr_rdy_work, rt9455_pwr_rdy_work_callback);
1656*4882a593Smuzhiyun 	INIT_DEFERRABLE_WORK(&info->max_charging_time_work,
1657*4882a593Smuzhiyun 			     rt9455_max_charging_time_work_callback);
1658*4882a593Smuzhiyun 	INIT_DEFERRABLE_WORK(&info->batt_presence_work,
1659*4882a593Smuzhiyun 			     rt9455_batt_presence_work_callback);
1660*4882a593Smuzhiyun 
1661*4882a593Smuzhiyun 	rt9455_charger_config.of_node		= dev->of_node;
1662*4882a593Smuzhiyun 	rt9455_charger_config.drv_data		= info;
1663*4882a593Smuzhiyun 	rt9455_charger_config.supplied_to	= rt9455_charger_supplied_to;
1664*4882a593Smuzhiyun 	rt9455_charger_config.num_supplicants	=
1665*4882a593Smuzhiyun 					ARRAY_SIZE(rt9455_charger_supplied_to);
1666*4882a593Smuzhiyun 	ret = devm_request_threaded_irq(dev, client->irq, NULL,
1667*4882a593Smuzhiyun 					rt9455_irq_handler_thread,
1668*4882a593Smuzhiyun 					IRQF_TRIGGER_LOW | IRQF_ONESHOT,
1669*4882a593Smuzhiyun 					RT9455_DRIVER_NAME, info);
1670*4882a593Smuzhiyun 	if (ret) {
1671*4882a593Smuzhiyun 		dev_err(dev, "Failed to register IRQ handler\n");
1672*4882a593Smuzhiyun 		goto put_usb_notifier;
1673*4882a593Smuzhiyun 	}
1674*4882a593Smuzhiyun 
1675*4882a593Smuzhiyun 	ret = rt9455_hw_init(info, ichrg, ieoc_percentage, mivr, iaicr);
1676*4882a593Smuzhiyun 	if (ret) {
1677*4882a593Smuzhiyun 		dev_err(dev, "Failed to set charger to its default values\n");
1678*4882a593Smuzhiyun 		goto put_usb_notifier;
1679*4882a593Smuzhiyun 	}
1680*4882a593Smuzhiyun 
1681*4882a593Smuzhiyun 	info->charger = devm_power_supply_register(dev, &rt9455_charger_desc,
1682*4882a593Smuzhiyun 						   &rt9455_charger_config);
1683*4882a593Smuzhiyun 	if (IS_ERR(info->charger)) {
1684*4882a593Smuzhiyun 		dev_err(dev, "Failed to register charger\n");
1685*4882a593Smuzhiyun 		ret = PTR_ERR(info->charger);
1686*4882a593Smuzhiyun 		goto put_usb_notifier;
1687*4882a593Smuzhiyun 	}
1688*4882a593Smuzhiyun 
1689*4882a593Smuzhiyun 	return 0;
1690*4882a593Smuzhiyun 
1691*4882a593Smuzhiyun put_usb_notifier:
1692*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_USB_PHY)
1693*4882a593Smuzhiyun 	if (info->nb.notifier_call)  {
1694*4882a593Smuzhiyun 		usb_unregister_notifier(info->usb_phy, &info->nb);
1695*4882a593Smuzhiyun 		info->nb.notifier_call = NULL;
1696*4882a593Smuzhiyun 	}
1697*4882a593Smuzhiyun #endif
1698*4882a593Smuzhiyun 	return ret;
1699*4882a593Smuzhiyun }
1700*4882a593Smuzhiyun 
rt9455_remove(struct i2c_client * client)1701*4882a593Smuzhiyun static int rt9455_remove(struct i2c_client *client)
1702*4882a593Smuzhiyun {
1703*4882a593Smuzhiyun 	int ret;
1704*4882a593Smuzhiyun 	struct rt9455_info *info = i2c_get_clientdata(client);
1705*4882a593Smuzhiyun 
1706*4882a593Smuzhiyun 	ret = rt9455_register_reset(info);
1707*4882a593Smuzhiyun 	if (ret)
1708*4882a593Smuzhiyun 		dev_err(&info->client->dev, "Failed to set charger to its default values\n");
1709*4882a593Smuzhiyun 
1710*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_USB_PHY)
1711*4882a593Smuzhiyun 	if (info->nb.notifier_call)
1712*4882a593Smuzhiyun 		usb_unregister_notifier(info->usb_phy, &info->nb);
1713*4882a593Smuzhiyun #endif
1714*4882a593Smuzhiyun 
1715*4882a593Smuzhiyun 	cancel_delayed_work_sync(&info->pwr_rdy_work);
1716*4882a593Smuzhiyun 	cancel_delayed_work_sync(&info->max_charging_time_work);
1717*4882a593Smuzhiyun 	cancel_delayed_work_sync(&info->batt_presence_work);
1718*4882a593Smuzhiyun 
1719*4882a593Smuzhiyun 	return ret;
1720*4882a593Smuzhiyun }
1721*4882a593Smuzhiyun 
1722*4882a593Smuzhiyun static const struct i2c_device_id rt9455_i2c_id_table[] = {
1723*4882a593Smuzhiyun 	{ RT9455_DRIVER_NAME, 0 },
1724*4882a593Smuzhiyun 	{ },
1725*4882a593Smuzhiyun };
1726*4882a593Smuzhiyun MODULE_DEVICE_TABLE(i2c, rt9455_i2c_id_table);
1727*4882a593Smuzhiyun 
1728*4882a593Smuzhiyun static const struct of_device_id rt9455_of_match[] = {
1729*4882a593Smuzhiyun 	{ .compatible = "richtek,rt9455", },
1730*4882a593Smuzhiyun 	{ },
1731*4882a593Smuzhiyun };
1732*4882a593Smuzhiyun MODULE_DEVICE_TABLE(of, rt9455_of_match);
1733*4882a593Smuzhiyun 
1734*4882a593Smuzhiyun #ifdef CONFIG_ACPI
1735*4882a593Smuzhiyun static const struct acpi_device_id rt9455_i2c_acpi_match[] = {
1736*4882a593Smuzhiyun 	{ "RT945500", 0 },
1737*4882a593Smuzhiyun 	{ }
1738*4882a593Smuzhiyun };
1739*4882a593Smuzhiyun MODULE_DEVICE_TABLE(acpi, rt9455_i2c_acpi_match);
1740*4882a593Smuzhiyun #endif
1741*4882a593Smuzhiyun 
1742*4882a593Smuzhiyun static struct i2c_driver rt9455_driver = {
1743*4882a593Smuzhiyun 	.probe		= rt9455_probe,
1744*4882a593Smuzhiyun 	.remove		= rt9455_remove,
1745*4882a593Smuzhiyun 	.id_table	= rt9455_i2c_id_table,
1746*4882a593Smuzhiyun 	.driver = {
1747*4882a593Smuzhiyun 		.name		= RT9455_DRIVER_NAME,
1748*4882a593Smuzhiyun 		.of_match_table	= of_match_ptr(rt9455_of_match),
1749*4882a593Smuzhiyun 		.acpi_match_table = ACPI_PTR(rt9455_i2c_acpi_match),
1750*4882a593Smuzhiyun 	},
1751*4882a593Smuzhiyun };
1752*4882a593Smuzhiyun module_i2c_driver(rt9455_driver);
1753*4882a593Smuzhiyun 
1754*4882a593Smuzhiyun MODULE_LICENSE("GPL");
1755*4882a593Smuzhiyun MODULE_AUTHOR("Anda-Maria Nicolae <anda-maria.nicolae@intel.com>");
1756*4882a593Smuzhiyun MODULE_DESCRIPTION("Richtek RT9455 Charger Driver");
1757