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