2 driver/usbpd/s2mu106.c - s2mu106 USB PD(Power Delivery) device driver
4 * Copyright (C) 2018 Samsung Electronics
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
18 #include <linux/gpio.h>
19 #include <linux/of_gpio.h>
20 #include <linux/i2c.h>
21 #include <linux/interrupt.h>
22 #include <linux/slab.h>
23 #include <linux/platform_device.h>
24 #include <linux/module.h>
25 #include <linux/delay.h>
26 #include <linux/completion.h>
28 #include <linux/ccic/usbpd.h>
29 #include <linux/ccic/usbpd-s2mu106.h>
31 #if defined(CONFIG_PM_S2MU106)
32 #include <linux/power/s2mu106_pmeter.h>
35 #include <linux/muic/muic.h>
36 #if defined(CONFIG_MUIC_NOTIFIER)
37 #include <linux/muic/muic_notifier.h>
38 #endif /* CONFIG_MUIC_NOTIFIER */
39 #ifdef CONFIG_BATTERY_SAMSUNG
40 #include <linux/sec_batt.h>
41 #include <linux/battery/sec_charging_common.h>
43 #include <linux/power_supply.h>
45 #if defined(CONFIG_USB_HOST_NOTIFY) || defined(CONFIG_USB_HW_PARAM)
46 #include <linux/usb_notify.h>
48 #include <linux/regulator/consumer.h>
50 #if (defined CONFIG_IFCONN_NOTIFIER || defined CONFIG_DUAL_ROLE_USB_INTF)
51 #include <linux/ccic/usbpd_ext.h>
53 #if defined CONFIG_IFCONN_NOTIFIER
54 struct pdic_notifier_data pd_noti
;
59 static usbpd_phy_ops_type s2mu106_ops
;
60 struct i2c_client
*test_i2c
;
62 static enum power_supply_property ccic_props
[] = {
65 static char *ccic_supplied_to
[] = {
71 static int s2mu106_receive_message(void *data
);
72 static int s2mu106_check_port_detect(struct s2mu106_usbpd_data
*pdic_data
);
73 static int s2mu106_usbpd_reg_init(struct s2mu106_usbpd_data
*_data
);
74 static void s2mu106_dfp(struct i2c_client
*i2c
);
75 static void s2mu106_ufp(struct i2c_client
*i2c
);
76 static int s2mu106_usbpd_check_msg(void *_data
, u64
*val
);
77 static void s2mu106_src(struct i2c_client
*i2c
);
78 static void s2mu106_snk(struct i2c_client
*i2c
);
79 static void s2mu106_assert_rd(void *_data
);
80 static void s2mu106_assert_rp(void *_data
);
81 static void s2mu106_assert_drp(void *_data
);
82 static void s2mu106_usbpd_check_rid(struct s2mu106_usbpd_data
*pdic_data
);
83 static int s2mu106_usbpd_read_reg(struct i2c_client
*i2c
, u8 reg
, u8
*dest
);
84 static int s2mu106_usbpd_write_reg(struct i2c_client
*i2c
, u8 reg
, u8 value
);
85 #ifndef CONFIG_SEC_FACTORY
86 static void s2mu106_usbpd_notify_detach(struct s2mu106_usbpd_data
*pdic_data
);
88 static void s2mu106_usbpd_detach_init(struct s2mu106_usbpd_data
*pdic_data
);
89 static int s2mu106_usbpd_set_cc_control(struct s2mu106_usbpd_data
*pdic_data
, int val
);
90 static void s2mu106_usbpd_set_rp_scr_sel(struct s2mu106_usbpd_data
*pdic_data
,
91 CCIC_RP_SCR_SEL scr_sel
);
103 static void s2mu106_usbpd_test_read(struct s2mu106_usbpd_data
*usbpd_data
)
105 struct i2c_client
*i2c
= usbpd_data
->i2c
;
108 s2mu106_usbpd_read_reg(i2c
, 0x1, &data
[0]);
109 s2mu106_usbpd_read_reg(i2c
, 0x18, &data
[1]);
110 s2mu106_usbpd_read_reg(i2c
, 0x27, &data
[2]);
111 s2mu106_usbpd_read_reg(i2c
, 0x28, &data
[3]);
112 s2mu106_usbpd_read_reg(i2c
, 0x40, &data
[4]);
113 s2mu106_usbpd_read_reg(i2c
, 0xe2, &data
[5]);
114 s2mu106_usbpd_read_reg(i2c
, 0xb3, &data
[6]);
115 s2mu106_usbpd_read_reg(i2c
, 0xb4, &data
[7]);
116 s2mu106_usbpd_read_reg(i2c
, 0xf7, &data
[8]);
118 pr_info("%s, 0x1(%x) 0x18(%x) 0x27(%x) 0x28(%x) 0x40(%x) 0xe2(%x) 0xb3(%x) 0xb4(%x) 0xf7(%X)\n",
119 __func__
, data
[0], data
[1], data
[2], data
[3], data
[4],
120 data
[5], data
[6], data
[7], data
[8]);
123 void s2mu106_rprd_mode_change(struct s2mu106_usbpd_data
*usbpd_data
, u8 mode
)
126 struct i2c_client
*i2c
= usbpd_data
->i2c
;
127 struct device
*dev
= &i2c
->dev
;
128 struct usbpd_data
*pd_data
= dev_get_drvdata(dev
);
129 pr_info("%s, mode=0x%x\n", __func__
, mode
);
131 mutex_lock(&usbpd_data
->_mutex
);
132 if (usbpd_data
->lpm_mode
)
135 pr_info("%s, %d\n", __func__
, __LINE__
);
137 case TYPE_C_ATTACH_DFP
: /* SRC */
138 s2mu106_usbpd_set_cc_control(usbpd_data
, USBPD_CC_OFF
);
139 s2mu106_usbpd_set_rp_scr_sel(usbpd_data
, PLUG_CTRL_RP0
);
140 s2mu106_assert_rp(pd_data
);
142 s2mu106_usbpd_detach_init(usbpd_data
);
143 s2mu106_usbpd_notify_detach(usbpd_data
);
145 s2mu106_usbpd_set_rp_scr_sel(usbpd_data
, PLUG_CTRL_RP80
);
146 msleep(S2MU106_ROLE_SWAP_TIME_MS
);
147 s2mu106_assert_drp(pd_data
);
148 usbpd_data
->status_reg
|= PLUG_ATTACH
;
149 schedule_delayed_work(&usbpd_data
->plug_work
, 0);
151 case TYPE_C_ATTACH_UFP
: /* SNK */
152 ifconn_event_work(usbpd_data
, IFCONN_NOTIFY_MUIC
,
153 IFCONN_NOTIFY_ID_ROLE_SWAP
,
154 IFCONN_NOTIFY_EVENT_PD_SINK
, NULL
);
155 s2mu106_usbpd_set_cc_control(usbpd_data
, USBPD_CC_OFF
);
156 s2mu106_assert_rp(pd_data
);
157 s2mu106_usbpd_set_rp_scr_sel(usbpd_data
, PLUG_CTRL_RP0
);
159 s2mu106_usbpd_detach_init(usbpd_data
);
160 s2mu106_usbpd_notify_detach(usbpd_data
);
162 s2mu106_assert_rd(pd_data
);
163 s2mu106_usbpd_set_rp_scr_sel(usbpd_data
, PLUG_CTRL_RP80
);
164 msleep(S2MU106_ROLE_SWAP_TIME_MS
);
165 s2mu106_assert_drp(pd_data
);
166 usbpd_data
->status_reg
|= PLUG_ATTACH
;
167 schedule_delayed_work(&usbpd_data
->plug_work
, 0);
169 case TYPE_C_ATTACH_DRP
: /* DRP */
170 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL_PORT
, &data
);
171 data
|= S2MU106_REG_PLUG_CTRL_DRP
;
172 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_PORT
, data
);
176 mutex_unlock(&usbpd_data
->_mutex
);
179 void usbpd_charger_test_read(struct s2mu106_usbpd_data
*usbpd_data
)
181 struct power_supply
*psy_charger
;
182 union power_supply_propval val
;
185 psy_charger
= power_supply_get_by_name("s2mu106-charger");
188 ret
= psy_charger
->desc
->set_property(psy_charger
,
189 POWER_SUPPLY_PROP_USBPD_TEST_READ
, &val
);
191 pr_err("%s: Fail to get psy battery\n", __func__
);
197 void vbus_turn_on_ctrl(struct s2mu106_usbpd_data
*usbpd_data
, bool enable
)
199 struct power_supply
*psy_otg
;
200 union power_supply_propval val
;
202 int ret
= 0, retry_cnt
= 0;
204 pr_info("%s %d, enable=%d\n", __func__
, __LINE__
, enable
);
206 if (usbpd_data
->detach_valid
) {
207 dev_info(usbpd_data
->dev
, "%s, ignore vbus control\n", __func__
);
211 psy_otg
= power_supply_get_by_name("otg");
215 usbpd_data
->is_otg_vboost
= enable
;
216 ret
= psy_otg
->desc
->set_property(psy_otg
, POWER_SUPPLY_PROP_ONLINE
, &val
);
218 pr_err("%s: Fail to get psy battery\n", __func__
);
223 pr_err("%s: fail to set power_suppy ONLINE property(%d)\n",
226 if (enable
== VBUS_ON
) {
227 for (retry_cnt
= 0; retry_cnt
< 5; retry_cnt
++) {
228 psy_otg
->desc
->get_property(psy_otg
, POWER_SUPPLY_PROP_ONLINE
, &val
);
229 if (val
.intval
== VBUS_OFF
) {
232 psy_otg
->desc
->set_property(psy_otg
, POWER_SUPPLY_PROP_ONLINE
, &val
);
237 pr_info("otg accessory power = %d\n", on
);
242 #ifdef CONFIG_PM_S2MU106
243 static void s2mu106_usbpd_set_pmeter_mode(struct s2mu106_usbpd_data
*pdic_data
,
246 struct power_supply
*psy_pm
= pdic_data
->psy_pm
;
247 union power_supply_propval val
;
250 pr_info("%s, mode=%d\n", __func__
, mode
);
254 ret
= psy_pm
->desc
->set_property(psy_pm
,
255 POWER_SUPPLY_PROP_CO_ENABLE
, &val
);
257 pr_err("%s: Fail to get pmeter\n", __func__
);
262 pr_err("%s: Fail to set pmeter\n", __func__
);
267 static int s2mu106_usbpd_get_pmeter_volt(struct s2mu106_usbpd_data
*pdic_data
)
270 struct power_supply
*psy_pm
= pdic_data
->psy_pm
;
271 union power_supply_propval val
;
275 ret
= psy_pm
->desc
->get_property(psy_pm
, POWER_SUPPLY_PROP_VCHGIN
, &val
);
277 pr_err("%s: Fail to get pmeter\n", __func__
);
282 pr_err("%s: fail to set power_suppy pmeter property(%d)\n",
287 pdic_data
->pm_chgin
= val
.intval
;
292 static int s2mu106_usbpd_get_pmeter_current(struct s2mu106_usbpd_data
*pdic_data
)
295 struct power_supply
*psy_pm
= pdic_data
->psy_pm
;
296 union power_supply_propval val
;
300 psy_pm
->desc
->get_property(psy_pm
, POWER_SUPPLY_PROP_ICHGIN
, &val
);
302 pr_err("%s: Fail to get pmeter\n", __func__
);
307 pr_err("%s: fail to set power_suppy pmeter property(%d)\n",
312 pdic_data
->pm_chgin_i
= val
.intval
;
317 static int s2mu106_usbpd_check_vbus(struct s2mu106_usbpd_data
*pdic_data
,
318 int volt
, CCIC_VBUS_SEL mode
)
322 if (mode
== VBUS_OFF
) {
323 ret
= s2mu106_usbpd_get_pmeter_volt(pdic_data
);
327 if (pdic_data
->pm_chgin
< volt
) {
328 pr_info("%s chgin volt(%d) finish!\n", __func__
,
329 pdic_data
->pm_chgin
);
332 pr_info("%s chgin volt(%d) waiting 400ms!\n",
333 __func__
, pdic_data
->pm_chgin
);
337 } else if (mode
== VBUS_ON
) {
338 ret
= s2mu106_usbpd_get_pmeter_volt(pdic_data
);
341 if (pdic_data
->pm_chgin
> volt
) {
342 pr_info("%s vbus volt(%d->%d) mode(%d)!\n",
343 __func__
, volt
, pdic_data
->pm_chgin
, mode
);
349 pr_info("%s failed check vbus volt(%d->%d) mode(%d)!\n",
350 __func__
, volt
, pdic_data
->pm_chgin
, mode
);
356 static int s2mu106_usbpd_check_accessory(struct s2mu106_usbpd_data
*pdic_data
)
358 struct i2c_client
*i2c
= pdic_data
->i2c
;
359 u8 val
, cc1_val
, cc2_val
;
361 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_MON1
, &val
);
363 cc1_val
= val
& S2MU106_REG_CTRL_MON_CC1_MASK
;
364 cc2_val
= (val
& S2MU106_REG_CTRL_MON_CC2_MASK
) >> S2MU106_REG_CTRL_MON_CC2_SHIFT
;
366 if ((cc1_val
== USBPD_Rd
&& cc2_val
== USBPD_Rd
) ||
367 (cc1_val
== USBPD_Ra
&& cc2_val
== USBPD_Ra
))
373 #if defined(CONFIG_IFCONN_NOTIFIER)
374 static void process_dr_swap(struct s2mu106_usbpd_data
*usbpd_data
)
376 schedule_delayed_work(&usbpd_data
->dr_work
, msecs_to_jiffies(0));
380 static void s2mu106_pr_swap(void *_data
, int val
)
382 struct usbpd_data
*data
= (struct usbpd_data
*) _data
;
383 struct s2mu106_usbpd_data
*pdic_data
= data
->phy_driver_data
;
385 if (val
== USBPD_SINK_OFF
) {
386 ifconn_event_work(pdic_data
, IFCONN_NOTIFY_MUIC
,
387 IFCONN_NOTIFY_ID_ROLE_SWAP
,
388 IFCONN_NOTIFY_EVENT_PD_SOURCE
, 0);
389 ifconn_event_work(pdic_data
, IFCONN_NOTIFY_BATTERY
,
390 IFCONN_NOTIFY_ID_DETACH
, 0, 0);
391 } else if (val
== USBPD_SOURCE_ON
) {
392 #if defined(CONFIG_DUAL_ROLE_USB_INTF)
393 pdic_data
->power_role_dual
= DUAL_ROLE_PROP_PR_SRC
;
394 #elif defined(CONFIG_TYPEC)
395 pdic_data
->typec_power_role
= TYPEC_SOURCE
;
397 } else if (val
== USBPD_SOURCE_OFF
) {
398 ifconn_event_work(pdic_data
, IFCONN_NOTIFY_BATTERY
,
399 IFCONN_NOTIFY_ID_DETACH
, 0, 0);
400 #if defined(CONFIG_DUAL_ROLE_USB_INTF)
401 pdic_data
->power_role_dual
= DUAL_ROLE_PROP_PR_SNK
;
402 #elif defined(CONFIG_TYPEC)
403 pdic_data
->typec_power_role
= TYPEC_SINK
;
405 ifconn_event_work(pdic_data
, IFCONN_NOTIFY_MUIC
,
406 IFCONN_NOTIFY_ID_ROLE_SWAP
,
407 IFCONN_NOTIFY_EVENT_PD_SINK
, 0);
409 #if defined(CONFIG_TYPEC)
410 if (val
== USBPD_PR_DONE
) {
411 typec_set_pwr_role(pdic_data
->port
, pdic_data
->typec_power_role
);
412 if (pdic_data
->typec_try_state_change
== TYPE_C_PR_SWAP
)
413 complete(&pdic_data
->role_reverse_completion
);
418 static int s2mu106_usbpd_read_reg(struct i2c_client
*i2c
, u8 reg
, u8
*dest
)
421 struct device
*dev
= &i2c
->dev
;
422 #if defined(CONFIG_USB_HW_PARAM)
423 struct otg_notify
*o_notify
= get_otg_notify();
426 ret
= i2c_smbus_read_byte_data(i2c
, reg
);
428 dev_err(dev
, "%s reg(0x%x), ret(%d)\n", __func__
, reg
, ret
);
429 #if defined(CONFIG_USB_HW_PARAM)
431 inc_hw_param(o_notify
, USB_CCIC_I2C_ERROR_COUNT
);
440 static int s2mu106_usbpd_bulk_read(struct i2c_client
*i2c
, u8 reg
, int count
, u8
*buf
)
443 struct device
*dev
= &i2c
->dev
;
444 #if defined(CONFIG_USB_HW_PARAM)
445 struct otg_notify
*o_notify
= get_otg_notify();
447 #ifdef CONFIG_SEC_FACTORY
451 ret
= i2c_smbus_read_i2c_block_data(i2c
, reg
, count
, buf
);
452 #ifdef CONFIG_SEC_FACTORY
453 for (retry
= 0; retry
< 5; retry
++) {
455 dev_err(dev
, "%s reg(0x%x), ret(%d) retry(%d) after now\n",
456 __func__
, reg
, ret
, retry
);
458 ret
= i2c_smbus_read_i2c_block_data(i2c
, reg
, count
, buf
);
464 dev_err(dev
, "%s failed to read reg, ret(%d)\n", __func__
, ret
);
467 dev_err(dev
, "%s reg(0x%x), ret(%d)\n", __func__
, reg
, ret
);
470 #if defined(CONFIG_USB_HW_PARAM)
472 inc_hw_param(o_notify
, USB_CCIC_I2C_ERROR_COUNT
);
480 static int s2mu106_usbpd_write_reg(struct i2c_client
*i2c
, u8 reg
, u8 value
)
483 struct device
*dev
= &i2c
->dev
;
484 #if defined(CONFIG_USB_HW_PARAM)
485 struct otg_notify
*o_notify
= get_otg_notify();
488 ret
= i2c_smbus_write_byte_data(i2c
, reg
, value
);
490 dev_err(dev
, "%s reg(0x%x), ret(%d)\n", __func__
, reg
, ret
);
491 #if defined(CONFIG_USB_HW_PARAM)
493 inc_hw_param(o_notify
, USB_CCIC_I2C_ERROR_COUNT
);
499 static int s2mu106_usbpd_bulk_write(struct i2c_client
*i2c
, u8 reg
, int count
, u8
*buf
)
502 struct device
*dev
= &i2c
->dev
;
503 #if defined(CONFIG_USB_HW_PARAM)
504 struct otg_notify
*o_notify
= get_otg_notify();
507 ret
= i2c_smbus_write_i2c_block_data(i2c
, reg
, count
, buf
);
509 dev_err(dev
, "%s reg(0x%x), ret(%d)\n", __func__
, reg
, ret
);
510 #if defined(CONFIG_USB_HW_PARAM)
512 inc_hw_param(o_notify
, USB_CCIC_I2C_ERROR_COUNT
);
519 static int s2mu106_usbpd_update_bit(struct i2c_client
*i2c
,
520 u8 reg
, u8 mask
, u8 shift
, u8 value
)
525 ret
= s2mu106_usbpd_read_reg(i2c
, reg
, ®_val
);
527 pr_err("%s: Reg = 0x%X, val = 0x%X, read err : %d\n",
528 __func__
, reg
, reg_val
, ret
);
531 reg_val
|= value
<< shift
;
532 ret
= s2mu106_usbpd_write_reg(i2c
, reg
, reg_val
);
534 pr_err("%s: Reg = 0x%X, mask = 0x%X, val = 0x%X, write err : %d\n",
535 __func__
, reg
, mask
, value
, ret
);
541 static int s2mu106_write_msg_all(struct i2c_client
*i2c
, int count
, u8
*buf
)
545 ret
= s2mu106_usbpd_bulk_write(i2c
, S2MU106_REG_MSG_TX_HEADER_L
,
546 2 + (count
* 4), buf
);
551 static int s2mu106_write_msg_header(struct i2c_client
*i2c
, u8
*buf
)
555 ret
= s2mu106_usbpd_bulk_write(i2c
, S2MU106_REG_MSG_TX_HEADER_L
, 2, buf
);
560 static int s2mu106_write_msg_obj(struct i2c_client
*i2c
, int count
, data_obj_type
*obj
)
564 struct device
*dev
= &i2c
->dev
;
566 if (count
> S2MU106_MAX_NUM_MSG_OBJ
)
567 dev_err(dev
, "%s, not invalid obj count number\n", __func__
);
569 for (i
= 0; i
< count
; i
++) {
570 ret
= s2mu106_usbpd_bulk_write(i2c
,
571 S2MU106_REG_MSG_TX_OBJECT0_0_L
+ (4 * i
),
578 static int s2mu106_send_msg(struct i2c_client
*i2c
)
581 u8 reg
= S2MU106_REG_MSG_SEND_CON
;
582 u8 val
= S2MU106_REG_MSG_SEND_CON_OP_MODE
583 | S2MU106_REG_MSG_SEND_CON_SEND_MSG_EN
;
585 s2mu106_usbpd_write_reg(i2c
, reg
, val
);
587 ret
= s2mu106_usbpd_write_reg(i2c
, reg
, S2MU106_REG_MSG_SEND_CON_OP_MODE
|
588 S2MU106_REG_MSG_SEND_CON_HARD_EN
);
593 static int s2mu106_read_msg_header(struct i2c_client
*i2c
, msg_header_type
*header
)
597 ret
= s2mu106_usbpd_bulk_read(i2c
, S2MU106_REG_MSG_RX_HEADER_L
, 2, header
->byte
);
602 static int s2mu106_read_msg_obj(struct i2c_client
*i2c
, int count
, data_obj_type
*obj
)
606 struct device
*dev
= &i2c
->dev
;
608 if (count
> S2MU106_MAX_NUM_MSG_OBJ
) {
609 dev_err(dev
, "%s, not invalid obj count number\n", __func__
);
610 ret
= -EINVAL
; /*TODO: check fail case */
612 for (i
= 0; i
< count
; i
++) {
613 ret
= s2mu106_usbpd_bulk_read(i2c
,
614 S2MU106_REG_MSG_RX_OBJECT0_0_L
+ (4 * i
),
622 static void s2mu106_set_irq_enable(struct s2mu106_usbpd_data
*_data
,
623 u8 int0
, u8 int1
, u8 int2
, u8 int3
, u8 int4
, u8 int5
)
625 u8 int_mask
[S2MU106_MAX_NUM_INT_STATUS
]
626 = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
628 struct i2c_client
*i2c
= _data
->i2c
;
629 struct device
*dev
= &i2c
->dev
;
631 int_mask
[0] &= ~int0
;
632 int_mask
[1] &= ~int1
;
633 int_mask
[2] &= ~int2
;
634 int_mask
[3] &= ~int3
;
635 int_mask
[4] &= ~int4
;
636 int_mask
[5] &= ~int5
;
638 ret
= i2c_smbus_write_i2c_block_data(i2c
, S2MU106_REG_INT_MASK0
,
639 S2MU106_MAX_NUM_INT_STATUS
, int_mask
);
642 dev_err(dev
, "err write interrupt mask \n");
645 static void s2mu106_self_soft_reset(struct i2c_client
*i2c
)
647 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_ETC
,
648 S2MU106_REG_ETC_SOFT_RESET_EN
);
649 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_ETC
,
650 S2MU106_REG_ETC_SOFT_RESET_DIS
);
653 static void s2mu106_driver_reset(void *_data
)
655 struct usbpd_data
*data
= (struct usbpd_data
*) _data
;
656 struct s2mu106_usbpd_data
*pdic_data
= data
->phy_driver_data
;
659 pdic_data
->status_reg
= 0;
660 data
->wait_for_msg_arrived
= 0;
661 pdic_data
->header
.word
= 0;
662 for (i
= 0; i
< S2MU106_MAX_NUM_MSG_OBJ
; i
++)
663 pdic_data
->obj
[i
].object
= 0;
665 s2mu106_set_irq_enable(pdic_data
, ENABLED_INT_0
, ENABLED_INT_1
,
666 ENABLED_INT_2
, ENABLED_INT_3
, ENABLED_INT_4
, ENABLED_INT_5
);
669 static void s2mu106_assert_drp(void *_data
)
671 struct usbpd_data
*data
= (struct usbpd_data
*) _data
;
672 struct s2mu106_usbpd_data
*pdic_data
= data
->phy_driver_data
;
673 struct i2c_client
*i2c
= pdic_data
->i2c
;
676 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL_RpRd
, &val
);
677 val
&= ~S2MU106_REG_PLUG_CTRL_FSM_MANUAL_EN
;
678 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_RpRd
, val
);
680 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL_CC12
, &val
);
681 val
&= ~S2MU106_REG_PLUG_CTRL_FSM_MANUAL_INPUT_MASK
;
682 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_CC12
, val
);
685 static void s2mu106_assert_rd(void *_data
)
687 struct usbpd_data
*data
= (struct usbpd_data
*) _data
;
688 struct s2mu106_usbpd_data
*pdic_data
= data
->phy_driver_data
;
689 struct i2c_client
*i2c
= pdic_data
->i2c
;
692 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_MON1
, &val
);
694 cc1_val
= val
& S2MU106_REG_CTRL_MON_CC1_MASK
;
695 cc2_val
= (val
& S2MU106_REG_CTRL_MON_CC2_MASK
) >> S2MU106_REG_CTRL_MON_CC2_SHIFT
;
698 if (pdic_data
->cc1_val
== USBPD_Rd
) {
699 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL_CC12
, &val
);
700 val
= (val
& ~S2MU106_REG_PLUG_CTRL_CC_MANUAL_MASK
) |
701 S2MU106_REG_PLUG_CTRL_CC1_MANUAL_ON
;
702 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_CC12
, val
);
704 if (pdic_data
->vconn_en
) {
705 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL_RpRd
, &val
);
706 val
= (val
& ~S2MU106_REG_PLUG_CTRL_CC_MANUAL_MASK
) |
707 S2MU106_REG_PLUG_CTRL_RpRd_CC2_VCONN
|
708 S2MU106_REG_PLUG_CTRL_VCONN_MANUAL_EN
;
709 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_RpRd
, val
);
713 if (pdic_data
->cc2_val
== USBPD_Rd
) {
714 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL_CC12
, &val
);
715 val
= (val
& ~S2MU106_REG_PLUG_CTRL_CC_MANUAL_MASK
) |
716 S2MU106_REG_PLUG_CTRL_CC2_MANUAL_ON
;
717 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_CC12
, val
);
719 if (pdic_data
->vconn_en
) {
720 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL_RpRd
, &val
);
721 val
= (val
& ~S2MU106_REG_PLUG_CTRL_CC_MANUAL_MASK
) |
722 S2MU106_REG_PLUG_CTRL_RpRd_CC1_VCONN
|
723 S2MU106_REG_PLUG_CTRL_VCONN_MANUAL_EN
;
724 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_RpRd
, val
);
728 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL_CC12
, &val
);
729 val
&= ~S2MU106_REG_PLUG_CTRL_FSM_MANUAL_INPUT_MASK
;
730 val
|= S2MU106_REG_PLUG_CTRL_FSM_ATTACHED_SNK
;
731 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_CC12
, val
);
733 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL_RpRd
, &val
);
734 val
|= S2MU106_REG_PLUG_CTRL_FSM_MANUAL_EN
;
735 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_RpRd
, val
);
738 static void s2mu106_assert_rp(void *_data
)
740 struct usbpd_data
*data
= (struct usbpd_data
*) _data
;
741 struct s2mu106_usbpd_data
*pdic_data
= data
->phy_driver_data
;
742 struct i2c_client
*i2c
= pdic_data
->i2c
;
745 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL_CC12
, &val
);
746 val
&= ~S2MU106_REG_PLUG_CTRL_FSM_MANUAL_INPUT_MASK
;
747 val
|= S2MU106_REG_PLUG_CTRL_FSM_ATTACHED_SRC
;
748 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_CC12
, val
);
750 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL_RpRd
, &val
);
751 val
|= S2MU106_REG_PLUG_CTRL_FSM_MANUAL_EN
;
752 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_RpRd
, val
);
755 static unsigned s2mu106_get_status(void *_data
, unsigned flag
)
758 struct usbpd_data
*data
= (struct usbpd_data
*) _data
;
759 struct s2mu106_usbpd_data
*pdic_data
= data
->phy_driver_data
;
761 if (pdic_data
->status_reg
& flag
) {
762 ret
= pdic_data
->status_reg
& flag
;
763 pdic_data
->status_reg
&= ~flag
; /* clear the flag */
770 static bool s2mu106_poll_status(void *_data
)
772 struct usbpd_data
*data
= (struct usbpd_data
*) _data
;
773 struct s2mu106_usbpd_data
*pdic_data
= data
->phy_driver_data
;
774 struct i2c_client
*i2c
= pdic_data
->i2c
;
775 struct device
*dev
= &i2c
->dev
;
776 u8 intr
[S2MU106_MAX_NUM_INT_STATUS
] = {0};
777 int ret
= 0, retry
= 0;
778 u64 status_reg_val
= 0;
779 msg_header_type header
;
780 int data_obj_num
= 0;
782 ret
= s2mu106_usbpd_bulk_read(i2c
, S2MU106_REG_INT_STATUS0
,
783 S2MU106_MAX_NUM_INT_STATUS
, intr
);
785 dev_info(dev
, "%s status[0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x]\n",
786 __func__
, intr
[0], intr
[1], intr
[2], intr
[3], intr
[4], intr
[5], intr
[6]);
788 if ((intr
[0] | intr
[1] | intr
[2] | intr
[3] | intr
[4] | intr
[5]) == 0)
791 if ((intr
[2] & S2MU106_REG_INT_STATUS2_WAKEUP
) ||
792 (intr
[4] & S2MU106_REG_INT_STATUS4_CC12_DET_IRQ
))
793 s2mu106_set_irq_enable(pdic_data
, ENABLED_INT_0
, ENABLED_INT_1
,
794 ENABLED_INT_2
, ENABLED_INT_3
, ENABLED_INT_4
, ENABLED_INT_5
);
796 /* when occur detach & attach atomic */
797 if (intr
[4] & S2MU106_REG_INT_STATUS4_USB_DETACH
) {
798 status_reg_val
|= PLUG_DETACH
;
801 mutex_lock(&pdic_data
->lpm_mutex
);
802 if ((intr
[4] & S2MU106_REG_INT_STATUS4_PLUG_IRQ
) &&
803 !pdic_data
->lpm_mode
&& !pdic_data
->is_water_detect
)
804 status_reg_val
|= PLUG_ATTACH
;
805 else if (pdic_data
->lpm_mode
&&
806 (intr
[4] & S2MU106_REG_INT_STATUS4_PLUG_IRQ
) &&
807 !pdic_data
->is_water_detect
)
809 mutex_unlock(&pdic_data
->lpm_mutex
);
813 mutex_lock(&pdic_data
->lpm_mutex
);
814 if ((intr
[4] & S2MU106_REG_INT_STATUS4_PLUG_IRQ
) &&
815 !pdic_data
->lpm_mode
&& !pdic_data
->is_water_detect
)
816 status_reg_val
|= PLUG_ATTACH
;
817 mutex_unlock(&pdic_data
->lpm_mutex
);
820 if (intr
[5] & S2MU106_REG_INT_STATUS5_HARD_RESET
)
821 status_reg_val
|= MSG_HARDRESET
;
823 if (intr
[0] & S2MU106_REG_INT_STATUS0_MSG_GOODCRC
)
824 status_reg_val
|= MSG_GOODCRC
;
826 if (intr
[1] & S2MU106_REG_INT_STATUS1_MSG_PR_SWAP
)
827 status_reg_val
|= MSG_PR_SWAP
;
829 if (intr
[2] & S2MU106_REG_INT_STATUS2_MSG_SOFTRESET
)
830 status_reg_val
|= MSG_SOFTRESET
;
832 if (intr
[1] & S2MU106_REG_INT_STATUS1_MSG_DR_SWAP
)
833 status_reg_val
|= MSG_DR_SWAP
;
835 if (intr
[0] & S2MU106_REG_INT_STATUS0_MSG_ACCEPT
)
836 status_reg_val
|= MSG_ACCEPT
;
838 /* function that support dp control */
839 if (intr
[4] & S2MU106_REG_INT_STATUS4_MSG_PASS
) {
840 if (intr
[3] & S2MU106_REG_INT_STATUS3_UNS_CMD_DATA
)
841 status_reg_val
|= MSG_RID
;
843 usbpd_protocol_rx(data
);
844 if (data
->msg_received
== 0)
847 header
= data
->protocol_rx
.msg_header
;
848 data_obj_num
= header
.num_data_objs
;
850 if (data_obj_num
> 0)
851 s2mu106_usbpd_check_msg(data
, &status_reg_val
);
853 if (intr
[1] & S2MU106_REG_INT_STATUS1_MSG_PSRDY
)
854 status_reg_val
|= MSG_PSRDY
;
856 if (intr
[2] & S2MU106_REG_INT_STATUS2_MSG_REQUEST
)
857 status_reg_val
|= MSG_REQUEST
;
859 if (intr
[1] & S2MU106_REG_INT_STATUS1_MSG_REJECT
)
860 status_reg_val
|= MSG_REJECT
;
862 if (intr
[2] & S2MU106_REG_INT_STATUS2_MSG_WAIT
)
863 status_reg_val
|= MSG_WAIT
;
865 if (intr
[4] & S2MU106_REG_INT_STATUS4_MSG_ERROR
)
866 status_reg_val
|= MSG_ERROR
;
868 if (intr
[1] & S2MU106_REG_INT_STATUS1_MSG_PING
)
869 status_reg_val
|= MSG_PING
;
871 if (intr
[1] & S2MU106_REG_INT_STATUS1_MSG_GETSNKCAP
)
872 status_reg_val
|= MSG_GET_SNK_CAP
;
874 if (intr
[1] & S2MU106_REG_INT_STATUS1_MSG_GETSRCCAP
)
875 status_reg_val
|= MSG_GET_SRC_CAP
;
877 if (intr
[2] & S2MU106_REG_INT_STATUS2_MSG_VCONN_SWAP
)
878 status_reg_val
|= MSG_VCONN_SWAP
;
882 pdic_data
->status_reg
|= status_reg_val
;
884 /* complete wait msg */
885 if (pdic_data
->status_reg
& data
->wait_for_msg_arrived
) {
886 data
->wait_for_msg_arrived
= 0;
887 complete(&data
->msg_arrived
);
893 static void s2mu106_soft_reset(void *_data
)
895 struct usbpd_data
*data
= (struct usbpd_data
*) _data
;
896 struct s2mu106_usbpd_data
*pdic_data
= data
->phy_driver_data
;
897 struct i2c_client
*i2c
= pdic_data
->i2c
;
899 s2mu106_self_soft_reset(i2c
);
902 static int s2mu106_hard_reset(void *_data
)
904 struct usbpd_data
*data
= (struct usbpd_data
*) _data
;
905 struct s2mu106_usbpd_data
*pdic_data
= data
->phy_driver_data
;
906 struct i2c_client
*i2c
= pdic_data
->i2c
;
911 if (pdic_data
->rid
!= REG_RID_UNDF
&& pdic_data
->rid
!= REG_RID_MAX
)
914 reg
= S2MU106_REG_MSG_SEND_CON
;
916 ret
= s2mu106_usbpd_write_reg(i2c
, reg
, S2MU106_REG_MSG_SEND_CON_SOP_HardRST
917 | S2MU106_REG_MSG_SEND_CON_OP_MODE
);
921 ret
= s2mu106_usbpd_write_reg(i2c
, reg
, S2MU106_REG_MSG_SEND_CON_SOP_HardRST
922 | S2MU106_REG_MSG_SEND_CON_OP_MODE
923 | S2MU106_REG_MSG_SEND_CON_SEND_MSG_EN
);
928 Read_Value
&= ~S2MU106_REG_PLUG_CTRL_CC_MANUAL_MASK
;
929 Read_Value
|= S2MU106_REG_PLUG_CTRL_CC_MANUAL_EN
;
930 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_CC12
, Read_Value
);
932 ret
= s2mu106_usbpd_write_reg(i2c
, reg
, S2MU106_REG_MSG_SEND_CON_OP_MODE
933 | S2MU106_REG_MSG_SEND_CON_HARD_EN
);
935 ret
= s2mu106_usbpd_write_reg(i2c
, reg
, S2MU106_REG_MSG_SEND_CON_HARD_EN
);
939 s2mu106_self_soft_reset(i2c
);
941 pdic_data
->status_reg
= 0;
949 static int s2mu106_receive_message(void *data
)
951 struct s2mu106_usbpd_data
*pdic_data
= data
;
952 struct i2c_client
*i2c
= pdic_data
->i2c
;
953 struct device
*dev
= &i2c
->dev
;
957 ret
= s2mu106_read_msg_header(i2c
, &pdic_data
->header
);
959 dev_err(dev
, "%s read msg header error\n", __func__
);
961 if (pdic_data
->header
.spec_revision
< 2 &&
962 pdic_data
->header
.num_data_objs
> 0 &&
963 pdic_data
->header
.msg_type
== 6) {
964 usleep_range(500, 900);
965 ret
= s2mu106_read_msg_header(i2c
, &pdic_data
->header
);
967 dev_err(dev
, "%s read msg header error\n", __func__
);
970 obj_num
= pdic_data
->header
.num_data_objs
;
973 ret
= s2mu106_read_msg_obj(i2c
,
974 obj_num
, &pdic_data
->obj
[0]);
980 static int s2mu106_tx_msg(void *_data
,
981 msg_header_type
*header
, data_obj_type
*obj
)
983 struct usbpd_data
*data
= (struct usbpd_data
*) _data
;
984 struct s2mu106_usbpd_data
*pdic_data
= data
->phy_driver_data
;
985 struct i2c_client
*i2c
= pdic_data
->i2c
;
991 pr_info("%s, \n", __func__
);
993 /* if there is no attach, skip tx msg */
994 if (pdic_data
->detach_valid
)
998 /* using msg id counter at s2mu106 */
999 s2mu106_usbpd_read_reg(pdic_data
->i2c
, S2MU106_REG_ID_MONITOR
, ®_data
);
1000 msg_id
= reg_data
& S2MU106_REG_ID_MONITOR_MSG_ID_MASK
;
1001 header
->msg_id
= msg_id
;
1003 send_msg
[0] = header
->byte
[0];
1004 send_msg
[1] = header
->byte
[1];
1006 count
= header
->num_data_objs
;
1008 for (i
= 0; i
< count
; i
++) {
1009 send_msg
[2 + (i
* 4)] = obj
[i
].byte
[0];
1010 send_msg
[3 + (i
* 4)] = obj
[i
].byte
[1];
1011 send_msg
[4 + (i
* 4)] = obj
[i
].byte
[2];
1012 send_msg
[5 + (i
* 4)] = obj
[i
].byte
[3];
1015 ret
= s2mu106_write_msg_all(i2c
, count
, send_msg
);
1019 s2mu106_send_msg(i2c
);
1025 static int s2mu106_rx_msg(void *_data
,
1026 msg_header_type
*header
, data_obj_type
*obj
)
1028 struct usbpd_data
*data
= (struct usbpd_data
*) _data
;
1029 struct s2mu106_usbpd_data
*pdic_data
= data
->phy_driver_data
;
1033 if (!s2mu106_receive_message(pdic_data
)) {
1034 header
->word
= pdic_data
->header
.word
;
1035 count
= pdic_data
->header
.num_data_objs
;
1037 for (i
= 0; i
< count
; i
++)
1038 obj
[i
].object
= pdic_data
->obj
[i
].object
;
1040 pdic_data
->header
.word
= 0; /* To clear for duplicated call */
1047 static int s2mu106_set_otg_control(void *_data
, int val
)
1049 struct usbpd_data
*data
= (struct usbpd_data
*) _data
;
1050 struct s2mu106_usbpd_data
*pdic_data
= data
->phy_driver_data
;
1052 mutex_lock(&pdic_data
->cc_mutex
);
1054 vbus_turn_on_ctrl(pdic_data
, VBUS_ON
);
1056 vbus_turn_on_ctrl(pdic_data
, VBUS_OFF
);
1057 mutex_unlock(&pdic_data
->cc_mutex
);
1062 static int s2mu106_cc_instead_of_vbus(void *_data
, int enable
)
1064 struct usbpd_data
*data
= (struct usbpd_data
*)_data
;
1065 struct s2mu106_usbpd_data
*pdic_data
= data
->phy_driver_data
;
1066 struct i2c_client
*i2c
= pdic_data
->i2c
;
1069 //Setting for CC Detection with Vbus
1070 //It is recognized that Vbus falls when CC line falls
1071 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL_VBUS_MUX
, &val
);
1072 val
&= ~S2MU106_REG_RD_OR_VBUS_MUX_SEL
;
1073 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_VBUS_MUX
, val
);
1074 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL
, &val
);
1076 val
|= S2MU106_REG_PLUG_CTRL_ATTACH_OPT_EN
;
1078 val
&= ~S2MU106_REG_PLUG_CTRL_ATTACH_OPT_EN
;
1079 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL
, val
);
1084 static int s2mu106_set_cc_control(void *_data
, int val
)
1086 struct usbpd_data
*data
= (struct usbpd_data
*) _data
;
1087 struct s2mu106_usbpd_data
*pdic_data
= data
->phy_driver_data
;
1090 mutex_lock(&pdic_data
->cc_mutex
);
1091 ret
= s2mu106_usbpd_set_cc_control(pdic_data
, val
);
1092 mutex_unlock(&pdic_data
->cc_mutex
);
1097 static int s2mu106_set_rp_control(void *_data
, int val
)
1099 struct usbpd_data
*data
= (struct usbpd_data
*) _data
;
1100 struct s2mu106_usbpd_data
*pdic_data
= data
->phy_driver_data
;
1102 mutex_lock(&pdic_data
->cc_mutex
);
1103 s2mu106_usbpd_set_rp_scr_sel(pdic_data
, val
);
1104 mutex_unlock(&pdic_data
->cc_mutex
);
1109 static int s2mu106_vbus_on_check(void *_data
)
1111 struct usbpd_data
*data
= (struct usbpd_data
*) _data
;
1112 struct s2mu106_usbpd_data
*pdic_data
= data
->phy_driver_data
;
1114 return s2mu106_usbpd_check_vbus(pdic_data
, 3500, VBUS_ON
);
1117 static void s2mu106_set_pwr_opmode(void *_data
, int mode
)
1119 struct usbpd_data
*data
= (struct usbpd_data
*) _data
;
1120 struct s2mu106_usbpd_data
*pdic_data
= data
->phy_driver_data
;
1122 typec_set_pwr_opmode(pdic_data
->port
, mode
);
1125 #if defined(CONFIG_CHECK_CTYPE_SIDE) || defined(CONFIG_CCIC_SYSFS)
1126 static int s2mu106_get_side_check(void *_data
)
1128 struct usbpd_data
*data
= (struct usbpd_data
*) _data
;
1129 struct s2mu106_usbpd_data
*pdic_data
= data
->phy_driver_data
;
1130 struct i2c_client
*i2c
= pdic_data
->i2c
;
1131 u8 val
, cc1_val
, cc2_val
;
1133 s2mu106_usbpd_test_read(pdic_data
);
1135 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_MON1
, &val
);
1137 cc1_val
= val
& S2MU106_REG_CTRL_MON_CC1_MASK
;
1138 cc2_val
= (val
& S2MU106_REG_CTRL_MON_CC2_MASK
) >> S2MU106_REG_CTRL_MON_CC2_SHIFT
;
1140 if (cc1_val
== USBPD_Rd
)
1141 return USBPD_UP_SIDE
;
1142 else if (cc2_val
== USBPD_Rd
)
1143 return USBPD_DOWN_SIDE
;
1145 return USBPD_UNDEFFINED_SIDE
;
1148 static int s2mu106_set_vconn_source(void *_data
, int val
)
1150 struct usbpd_data
*data
= (struct usbpd_data
*) _data
;
1151 struct s2mu106_usbpd_data
*pdic_data
= data
->phy_driver_data
;
1152 struct i2c_client
*i2c
= pdic_data
->i2c
;
1153 u8 reg_data
= 0, reg_val
= 0, cc1_val
= 0, cc2_val
= 0;
1155 if (!pdic_data
->vconn_en
) {
1156 pr_err("%s, not support vconn source\n", __func__
);
1160 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_MON1
, ®_val
);
1161 cc1_val
= (reg_val
& S2MU106_REG_CTRL_MON_CC1_MASK
) >> S2MU106_REG_CTRL_MON_CC1_SHIFT
;
1162 cc2_val
= (reg_val
& S2MU106_REG_CTRL_MON_CC2_MASK
) >> S2MU106_REG_CTRL_MON_CC2_SHIFT
;
1164 if (val
== USBPD_VCONN_ON
) {
1165 if (cc1_val
== USBPD_Rd
) {
1166 if (cc2_val
== USBPD_Ra
) {
1167 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL_RpRd
, ®_data
);
1168 reg_data
&= ~S2MU106_REG_PLUG_CTRL_RpRd_VCONN_MASK
;
1169 reg_data
|= (S2MU106_REG_PLUG_CTRL_RpRd_CC2_VCONN
|
1170 S2MU106_REG_PLUG_CTRL_VCONN_MANUAL_EN
);
1171 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_RpRd
, reg_data
);
1174 if (cc2_val
== USBPD_Rd
) {
1175 if (cc1_val
== USBPD_Ra
) {
1176 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL_RpRd
, ®_data
);
1177 reg_data
&= ~S2MU106_REG_PLUG_CTRL_RpRd_VCONN_MASK
;
1178 reg_data
|= (S2MU106_REG_PLUG_CTRL_RpRd_CC1_VCONN
|
1179 S2MU106_REG_PLUG_CTRL_VCONN_MANUAL_EN
);
1180 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_RpRd
, reg_data
);
1183 } else if (val
== USBPD_VCONN_OFF
) {
1184 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL_RpRd
, ®_data
);
1185 reg_data
&= ~S2MU106_REG_PLUG_CTRL_RpRd_VCONN_MASK
;
1186 reg_data
|= S2MU106_REG_PLUG_CTRL_VCONN_MANUAL_EN
;
1187 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_RpRd
, reg_data
);
1191 pdic_data
->vconn_source
= val
;
1195 static void s2mu106_usbpd_set_vconn_manual(struct s2mu106_usbpd_data
*pdic_data
, bool enable
)
1199 s2mu106_usbpd_read_reg(pdic_data
->i2c
, S2MU106_REG_PLUG_CTRL_RpRd
, ®_data
);
1200 reg_data
&= ~S2MU106_REG_PLUG_CTRL_RpRd_VCONN_MASK
;
1203 reg_data
|= S2MU106_REG_PLUG_CTRL_VCONN_MANUAL_EN
;
1205 s2mu106_usbpd_write_reg(pdic_data
->i2c
, S2MU106_REG_PLUG_CTRL_RpRd
, reg_data
);
1208 static int s2mu106_get_vconn_source(void *_data
, int *val
)
1210 struct usbpd_data
*data
= (struct usbpd_data
*) _data
;
1211 struct s2mu106_usbpd_data
*pdic_data
= data
->phy_driver_data
;
1214 set s2mu106 pdic register control */
1216 if (pdic_data
->vconn_source
!= *val
) {
1217 dev_info(pdic_data
->dev
, "%s, vconn_source(%d) != gpio val(%d)\n",
1218 __func__
, pdic_data
->vconn_source
, *val
);
1219 pdic_data
->vconn_source
= *val
;
1225 /* val : sink(0) or source(1) */
1226 static int s2mu106_set_power_role(void *_data
, int val
)
1228 struct usbpd_data
*data
= (struct usbpd_data
*) _data
;
1229 struct s2mu106_usbpd_data
*pdic_data
= data
->phy_driver_data
;
1231 pr_info("%s, power_role(%d)\n", __func__
, val
);
1233 if (val
== USBPD_SINK
) {
1234 pdic_data
->is_pr_swap
= true;
1235 s2mu106_assert_rd(data
);
1236 s2mu106_snk(pdic_data
->i2c
);
1237 } else if (val
== USBPD_SOURCE
) {
1238 pdic_data
->is_pr_swap
= true;
1239 s2mu106_assert_rp(data
);
1240 s2mu106_src(pdic_data
->i2c
);
1241 } else if (val
== USBPD_DRP
) {
1242 pdic_data
->is_pr_swap
= false;
1243 s2mu106_assert_drp(data
);
1248 pdic_data
->power_role
= val
;
1252 static int s2mu106_get_power_role(void *_data
, int *val
)
1254 struct usbpd_data
*data
= (struct usbpd_data
*) _data
;
1255 struct s2mu106_usbpd_data
*pdic_data
= data
->phy_driver_data
;
1257 *val
= pdic_data
->power_role
;
1262 static int s2mu106_set_data_role(void *_data
, int val
)
1264 struct usbpd_data
*data
= (struct usbpd_data
*) _data
;
1265 struct s2mu106_usbpd_data
*pdic_data
= data
->phy_driver_data
;
1266 struct i2c_client
*i2c
= pdic_data
->i2c
;
1267 u8 val_port
, data_role
;
1269 /* DATA_ROLE (0x18[2])
1273 if (val
== USBPD_UFP
) {
1274 data_role
= S2MU106_REG_MSG_DATA_ROLE_UFP
;
1276 } else {/* (val == USBPD_DFP) */
1277 data_role
= S2MU106_REG_MSG_DATA_ROLE_DFP
;
1281 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL_MSG
, &val_port
);
1282 val_port
= (val_port
& ~S2MU106_REG_MSG_DATA_ROLE_MASK
) | data_role
;
1283 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_MSG
, val_port
);
1285 pdic_data
->data_role
= val
;
1287 #if defined(CONFIG_IFCONN_NOTIFIER)
1288 process_dr_swap(pdic_data
);
1293 static int s2mu106_get_data_role(void *_data
, int *val
)
1295 struct usbpd_data
*data
= (struct usbpd_data
*) _data
;
1296 struct s2mu106_usbpd_data
*pdic_data
= data
->phy_driver_data
;
1297 *val
= pdic_data
->data_role
;
1301 static int s2mu106_set_check_msg_pass(void *_data
, int val
)
1303 struct usbpd_data
*data
= (struct usbpd_data
*) _data
;
1304 struct s2mu106_usbpd_data
*pdic_data
= data
->phy_driver_data
;
1306 dev_info(pdic_data
->dev
, "%s: check_msg_pass val(%d)\n", __func__
, val
);
1308 pdic_data
->check_msg_pass
= val
;
1313 static void s2mu106_usbpd_set_threshold(struct s2mu106_usbpd_data
*pdic_data
,
1314 CCIC_RP_RD_SEL port_sel
, CCIC_THRESHOLD_SEL threshold_sel
)
1316 struct i2c_client
*i2c
= pdic_data
->i2c
;
1318 if (threshold_sel
> S2MU106_THRESHOLD_MAX
)
1319 dev_err(pdic_data
->dev
, "%s : threshold overflow!!\n", __func__
);
1321 if (port_sel
== PLUG_CTRL_RD
)
1322 s2mu106_usbpd_write_reg(i2c
,
1323 S2MU106_REG_PLUG_CTRL_SET_RD
, threshold_sel
);
1324 else if (port_sel
== PLUG_CTRL_RP
)
1325 s2mu106_usbpd_write_reg(i2c
,
1326 S2MU106_REG_PLUG_CTRL_SET_RP
, threshold_sel
);
1330 #ifndef CONFIG_SEC_FACTORY
1331 static void s2mu106_usbpd_set_rp_scr_sel(struct s2mu106_usbpd_data
*pdic_data
,
1332 CCIC_RP_SCR_SEL scr_sel
)
1334 struct i2c_client
*i2c
= pdic_data
->i2c
;
1336 pr_info("%s: scr_sel : (%d)\n", __func__
, scr_sel
);
1339 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL_PORT
, &data
);
1340 data
&= ~S2MU106_REG_PLUG_CTRL_RP_SEL_MASK
;
1341 data
|= S2MU106_REG_PLUG_CTRL_RP0
;
1342 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_PORT
, data
);
1344 case PLUG_CTRL_RP80
:
1345 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL_PORT
, &data
);
1346 data
&= ~S2MU106_REG_PLUG_CTRL_RP_SEL_MASK
;
1347 data
|= S2MU106_REG_PLUG_CTRL_RP80
;
1348 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_PORT
, data
);
1350 case PLUG_CTRL_RP180
:
1351 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL_PORT
, &data
);
1352 data
&= ~S2MU106_REG_PLUG_CTRL_RP_SEL_MASK
;
1353 data
|= S2MU106_REG_PLUG_CTRL_RP180
;
1354 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_PORT
, data
);
1363 int s2mu106_usbpd_check_msg(void *_data
, u64
*val
)
1365 struct usbpd_data
*data
= (struct usbpd_data
*) _data
;
1369 int vdm_command
= 0;
1371 dev_info(data
->dev
, "%s\n", __func__
);
1373 if (data
->protocol_rx
.msg_header
.num_data_objs
== 0)
1374 data_type
= USBPD_CTRL_MSG
;
1376 data_type
= USBPD_DATA_MSG
;
1378 msg_type
= data
->protocol_rx
.msg_header
.msg_type
;
1380 if (data_type
== USBPD_CTRL_MSG
)
1383 if (data_type
== USBPD_DATA_MSG
) {
1385 case USBPD_Source_Capabilities
:
1386 *val
|= MSG_SRC_CAP
;
1389 *val
|= MSG_REQUEST
;
1391 case USBPD_Sink_Capabilities
:
1392 *val
|= MSG_SNK_CAP
;
1397 case USBPD_Vendor_Defined
:
1398 vdm_command
= data
->protocol_rx
.data_obj
[0].structured_vdm
.command
;
1399 vdm_type
= data
->protocol_rx
.data_obj
[0].structured_vdm
.vdm_type
;
1401 if (vdm_type
== Unstructured_VDM
) {
1402 dev_info(data
->dev
, "%s : uvdm msg received!\n", __func__
);
1407 switch (vdm_command
) {
1408 case DisplayPort_Status_Update
:
1409 *val
|= VDM_DP_STATUS_UPDATE
;
1411 case DisplayPort_Configure
:
1412 *val
|= VDM_DP_CONFIGURE
;
1415 *val
|= VDM_ATTENTION
;
1418 *val
|= VDM_EXIT_MODE
;
1421 *val
|= VDM_ENTER_MODE
;
1423 case Discover_Modes
:
1424 *val
|= VDM_ENTER_MODE
;
1426 case Discover_SVIDs
:
1427 *val
|= VDM_DISCOVER_SVID
;
1429 case Discover_Identity
:
1430 *val
|= VDM_DISCOVER_IDENTITY
;
1441 dev_info(data
->dev
, "%s: msg status(%lld)\n", __func__
, *val
);
1446 static int s2mu106_usbpd_set_cc_control(struct s2mu106_usbpd_data
*pdic_data
, int val
)
1448 struct i2c_client
*i2c
= pdic_data
->i2c
;
1451 dev_info(pdic_data
->dev
, "%s, (%d)\n", __func__
, val
);
1453 if (pdic_data
->detach_valid
) {
1454 dev_info(pdic_data
->dev
, "%s, ignore cc control\n", __func__
);
1459 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL_CC12
, &data
);
1460 data
&= ~S2MU106_REG_PLUG_CTRL_CC_MANUAL_MASK
;
1461 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_CC12
, data
);
1463 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL
, &data
);
1464 data
|= S2MU106_REG_PLUG_CTRL_ECO_SRC_CAP_RDY
;
1465 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL
, data
);
1467 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL_CC12
, &data
);
1468 data
&= ~S2MU106_REG_PLUG_CTRL_CC_MANUAL_MASK
;
1469 data
|= S2MU106_REG_PLUG_CTRL_CC_MANUAL_EN
;
1470 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_CC12
, data
);
1472 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL
, &data
);
1473 data
&= ~S2MU106_REG_PLUG_CTRL_ECO_SRC_CAP_RDY
;
1474 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL
, data
);
1480 static void s2mu106_dfp(struct i2c_client
*i2c
)
1484 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL_MSG
, &data
);
1485 data
|= S2MU106_REG_MSG_DATA_ROLE_MASK
;
1486 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_MSG
, data
);
1489 static void s2mu106_ufp(struct i2c_client
*i2c
)
1492 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL_MSG
, &data
);
1493 data
&= ~S2MU106_REG_MSG_DATA_ROLE_MASK
;
1494 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_MSG
, data
);
1497 static void s2mu106_src(struct i2c_client
*i2c
)
1501 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL_MSG
, &data
);
1502 data
= (data
& ~S2MU106_REG_MSG_POWER_ROLE_MASK
) | S2MU106_REG_MSG_POWER_ROLE_SOURCE
;
1503 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_MSG
, data
);
1506 static void s2mu106_snk(struct i2c_client
*i2c
)
1510 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL_MSG
, &data
);
1511 data
= (data
& ~S2MU106_REG_MSG_POWER_ROLE_MASK
) | S2MU106_REG_MSG_POWER_ROLE_SINK
;
1512 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_MSG
, data
);
1515 #if defined(CONFIG_IFCONN_NOTIFIER)
1516 static void s2mu106_notify_pdic_rid(struct s2mu106_usbpd_data
*pdic_data
, int rid
)
1518 pdic_data
->is_factory_mode
= false;
1519 if (rid
== RID_523K
)
1520 pdic_data
->is_factory_mode
= true;
1522 ifconn_event_work(pdic_data
, IFCONN_NOTIFY_MUIC
,
1523 IFCONN_NOTIFY_ID_RID
, rid
, NULL
);
1525 if (rid
== REG_RID_523K
|| rid
== REG_RID_619K
|| rid
== REG_RID_OPEN
) {
1526 ifconn_event_work(pdic_data
, IFCONN_NOTIFY_USB
, IFCONN_NOTIFY_ID_USB
,
1527 IFCONN_NOTIFY_EVENT_ATTACH
, NULL
);
1528 ifconn_event_work(pdic_data
, IFCONN_NOTIFY_USB
,
1529 IFCONN_NOTIFY_ID_USB
, IFCONN_NOTIFY_EVENT_DETACH
, NULL
);
1530 pdic_data
->is_host
= HOST_OFF
;
1531 pdic_data
->is_client
= CLIENT_OFF
;
1532 } else if (rid
== REG_RID_301K
) {
1533 ifconn_event_work(pdic_data
, IFCONN_NOTIFY_USB
, IFCONN_NOTIFY_ID_USB
,
1534 IFCONN_NOTIFY_EVENT_USB_ATTACH_UFP
, NULL
);
1535 pdic_data
->is_host
= HOST_OFF
;
1536 pdic_data
->is_client
= CLIENT_ON
;
1539 dev_info(pdic_data
->dev
, "%s : attached rid state(%d)", __func__
, rid
);
1543 static void s2mu106_usbpd_check_rid(struct s2mu106_usbpd_data
*pdic_data
)
1545 struct i2c_client
*i2c
= pdic_data
->i2c
;
1547 int prev_rid
= pdic_data
->rid
;
1551 if (pdic_data
->check_rid_wa
)
1554 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_ADC_STATUS
, &rid
);
1555 rid
= (rid
& S2MU106_PDIC_RID_MASK
) >> S2MU106_PDIC_RID_SHIFT
;
1557 dev_info(pdic_data
->dev
, "%s : attached rid state(%d)", __func__
, rid
);
1560 if (pdic_data
->rid
!= rid
) {
1561 pdic_data
->rid
= rid
;
1562 if (prev_rid
>= REG_RID_OPEN
&& rid
>= REG_RID_OPEN
)
1563 dev_err(pdic_data
->dev
,
1564 "%s : rid is not changed, skip notify(%d)", __func__
, rid
);
1566 s2mu106_notify_pdic_rid(pdic_data
, rid
);
1569 if (rid
>= REG_RID_MAX
) {
1570 dev_err(pdic_data
->dev
, "%s : overflow rid value", __func__
);
1576 int s2mu106_set_normal_mode(struct s2mu106_usbpd_data
*pdic_data
)
1581 struct i2c_client
*i2c
= pdic_data
->i2c
;
1582 struct device
*dev
= &i2c
->dev
;
1584 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL_PORT
, &data
);
1585 data
&= ~(S2MU106_REG_PLUG_CTRL_MODE_MASK
| S2MU106_REG_PLUG_CTRL_RP_SEL_MASK
);
1586 data
|= S2MU106_REG_PLUG_CTRL_DRP
| S2MU106_REG_PLUG_CTRL_RP80
;
1588 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PD_CTRL
, &data_lpm
);
1589 data_lpm
&= ~S2MU106_REG_LPM_EN
;
1591 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_PORT
, data
);
1592 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PD_CTRL
, data_lpm
);
1594 pdic_data
->lpm_mode
= false;
1596 s2mu106_set_irq_enable(pdic_data
, ENABLED_INT_0
, ENABLED_INT_1
,
1597 ENABLED_INT_2
, ENABLED_INT_3
, ENABLED_INT_4
, ENABLED_INT_5
);
1599 dev_info(dev
, "%s s2mu106 exit lpm mode\n", __func__
);
1604 int s2mu106_usbpd_lpm_check(struct s2mu106_usbpd_data
*pdic_data
)
1607 struct i2c_client
*i2c
= pdic_data
->i2c
;
1609 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PD_CTRL
, &data_lpm
);
1611 return (data_lpm
& S2MU106_REG_LPM_EN
);
1614 void s2mu106_usbpd_set_mode(struct s2mu106_usbpd_data
*pdic_data
,
1615 CCIC_LPM_MODE_SEL mode
)
1618 struct i2c_client
*i2c
= pdic_data
->i2c
;
1620 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PD_CTRL
, &data_lpm
);
1621 if (mode
== PD_LPM_MODE
)
1622 data_lpm
|= S2MU106_REG_LPM_EN
;
1623 else if (mode
== PD_NORMAL_MODE
)
1624 data_lpm
&= ~S2MU106_REG_LPM_EN
;
1626 pr_info("%s mode val(%d) is invalid\n", __func__
, mode
);
1630 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PD_CTRL
, data_lpm
);
1633 void s2mu106_usbpd_set_vbus_wakeup(struct s2mu106_usbpd_data
*pdic_data
,
1634 CCIC_VBUS_WAKEUP_SEL sel
)
1636 struct i2c_client
*i2c
= pdic_data
->i2c
;
1639 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PD_TRIM
, &data
);
1640 if (sel
== VBUS_WAKEUP_ENABLE
)
1641 data
&= ~S2MU106_REG_VBUS_WAKEUP_DIS
;
1642 else if (sel
== VBUS_WAKEUP_DISABLE
)
1643 data
|= S2MU106_REG_VBUS_WAKEUP_DIS
;
1645 pr_info("%s sel val(%d) is invalid\n", __func__
, sel
);
1649 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PD_TRIM
, data
);
1652 int s2mu106_get_plug_monitor(struct s2mu106_usbpd_data
*pdic_data
, u8
*data
)
1656 struct i2c_client
*i2c
= pdic_data
->i2c
;
1658 if (&data
[0] == NULL
|| &data
[1] == NULL
) {
1659 pr_err("%s NULL point data\n", __func__
);
1663 ret
= s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_MON1
, ®_val
);
1665 pr_err("%s: S2MU106_REG_PLUG_MON1 Read err : %d\n", __func__
, ret
);
1669 data
[0] = reg_val
& S2MU106_REG_CTRL_MON_CC1_MASK
;
1670 data
[1] = (reg_val
& S2MU106_REG_CTRL_MON_CC2_MASK
) >> S2MU106_REG_CTRL_MON_CC2_SHIFT
;
1671 pr_info("%s, water cc mon cc1 : 0x%X, cc2 : 0x%X\n", __func__
, data
[0], data
[1]);
1676 int s2mu106_set_lpm_mode(struct s2mu106_usbpd_data
*pdic_data
)
1680 struct i2c_client
*i2c
= pdic_data
->i2c
;
1681 struct device
*dev
= &i2c
->dev
;
1682 u8 intr
[S2MU106_MAX_NUM_INT_STATUS
] = {0};
1684 pdic_data
->lpm_mode
= true;
1686 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL_PORT
, &data
);
1687 data
&= ~(S2MU106_REG_PLUG_CTRL_MODE_MASK
| S2MU106_REG_PLUG_CTRL_RP_SEL_MASK
);
1688 data
|= S2MU106_REG_PLUG_CTRL_DFP
| S2MU106_REG_PLUG_CTRL_RP0
;
1689 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PD_CTRL
, &data_lpm
);
1690 data_lpm
|= S2MU106_REG_LPM_EN
;
1692 s2mu106_set_irq_enable(pdic_data
, 0, 0, 0, 0, 0, 0);
1694 ret
= s2mu106_usbpd_bulk_read(i2c
, S2MU106_REG_INT_STATUS0
,
1695 S2MU106_MAX_NUM_INT_STATUS
, intr
);
1697 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_PORT
, data
);
1698 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PD_CTRL
, data_lpm
);
1700 if (pdic_data
->detach_valid
== false) {
1701 s2mu106_usbpd_detach_init(pdic_data
);
1702 s2mu106_usbpd_notify_detach(pdic_data
);
1705 dev_info(dev
, "%s s2mu106 enter lpm mode\n", __func__
);
1710 void s2mu106_set_water_detect_pre_cond(struct s2mu106_usbpd_data
*pdic_data
)
1713 u8 cc_val
[2] = {0,};
1715 s2mu106_set_normal_mode(pdic_data
);
1718 for (i
= 0; i
< 14; i
++) {
1719 if (s2mu106_get_plug_monitor(pdic_data
, cc_val
) < 0) {
1720 pr_info("%s abnormal", __func__
);
1723 if (IS_CC_RP(cc_val
[0], cc_val
[1]))
1726 pr_info("%s Not Rp yet. ", __func__
);
1733 void s2mu106_set_water_1st_detect(struct s2mu106_usbpd_data
*pdic_data
)
1736 struct i2c_client
*i2c
= pdic_data
->i2c
;
1737 struct device
*dev
= &i2c
->dev
;
1739 pdic_data
->lpm_mode
= true;
1740 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_SET_RP
, S2MU106_THRESHOLD_MAX
);
1742 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL_PORT
, &data
);
1743 data
&= ~(S2MU106_REG_PLUG_CTRL_MODE_MASK
| S2MU106_REG_PLUG_CTRL_RP_SEL_MASK
);
1744 data
|= S2MU106_REG_PLUG_CTRL_DFP
| S2MU106_REG_PLUG_CTRL_RP80
1745 | S2MU106_REG_PLUG_CTRL_DETECT_BAT_DISABLE_MASK
1746 | S2MU106_REG_PLUG_CTRL_DETECT_OCP_DISABLE_MASK
;
1747 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PD_CTRL
, &data_lpm
);
1748 data_lpm
|= S2MU106_REG_LPM_EN
;
1750 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_PORT
, data
);
1751 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PD_CTRL
, data_lpm
);
1753 s2mu106_set_irq_enable(pdic_data
, 0, 0, 0, 0, 0, 0);
1755 usleep_range(500, 900);
1757 data
&= ~(S2MU106_REG_PLUG_CTRL_MODE_MASK
| S2MU106_REG_PLUG_CTRL_RP_SEL_MASK
);
1758 data
|= S2MU106_REG_PLUG_CTRL_DFP
| S2MU106_REG_PLUG_CTRL_RP0
;
1759 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_PORT
, data
);
1761 dev_info(dev
, "%s s2mu106 enter water chk lpm mode\n", __func__
);
1764 static bool s2mu106_is_water_detected_2nd_seq(struct s2mu106_usbpd_data
*pdic_data
, u8
*cc_val
)
1766 struct i2c_client
*i2c
= pdic_data
->i2c
;
1767 u8 cc_chk
[2] = {0,};
1769 if (cc_val
[0] == USBPD_Rp
)
1771 if (cc_val
[1] == USBPD_Rp
)
1774 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_SET_RD
,
1775 S2MU106_THRESHOLD_214MV
);
1776 s2mu106_set_lpm_mode(pdic_data
);
1777 s2mu106_usbpd_update_bit(i2c
, S2MU106_REG_PD_CTRL
,
1778 S2MU106_REG_LPM_EN
, 0, 0);
1781 if (s2mu106_get_plug_monitor(pdic_data
, cc_val
) < 0) {
1782 pr_err("%s Failed to get the plug monitor.\n", __func__
);
1786 /* Rd is detected due to the water CAPACITOR. */
1787 if (((cc_chk
[0] && !cc_chk
[1]) && (cc_val
[0] == USBPD_Rd
)) ||
1788 ((cc_chk
[1] && !cc_chk
[0]) && (cc_val
[1] == USBPD_Rd
)) ||
1789 ((cc_chk
[0] && cc_chk
[1]) && ((cc_val
[0] == USBPD_Rd
) && (cc_val
[1] == USBPD_Rd
)))) {
1796 static void _S2MU106_PDIC_enter_to_water(struct s2mu106_usbpd_data
*pdic_data
)
1798 struct i2c_client
*i2c
= pdic_data
->i2c
;
1799 #if defined(CONFIG_USB_HW_PARAM) && !defined(CONFIG_USB_TYPEC_MANAGER_NOTIFIER)
1800 struct otg_notify
*o_notify
= get_otg_notify();
1803 #if defined(CONFIG_CCIC_NOTIFIER)
1804 ccic_event_work(pdic_data
,
1805 CCIC_NOTIFY_DEV_MUIC
, CCIC_NOTIFY_ID_WATER
, CCIC_NOTIFY_ATTACH
, 0);
1807 pdic_data
->is_water_detect
= true;
1808 pdic_data
->water_detect_cnt
= 0;
1809 s2mu106_set_lpm_mode(pdic_data
);
1810 s2mu106_usbpd_update_bit(i2c
, S2MU106_REG_PD_CTRL
,
1811 S2MU106_REG_LPM_EN
, 0, 0);
1812 #if defined(CONFIG_USB_HW_PARAM) && !defined(CONFIG_USB_TYPEC_MANAGER_NOTIFIER)
1814 inc_hw_param(o_notify
, USB_CCIC_WATER_INT_COUNT
);
1818 static void S2MU106_PDIC_water_detect_handler(struct work_struct
*work
)
1820 struct s2mu106_usbpd_data
*pdic_data
=
1821 container_of(work
, struct s2mu106_usbpd_data
, water_detect_handler
.work
);
1822 struct i2c_client
*i2c
= pdic_data
->i2c
;
1824 u8 cc_val
[2] = {0,};
1826 pr_info("%s enter", __func__
);
1827 mutex_lock(&pdic_data
->_mutex
);
1830 * Cancel the detect handler,
1831 * in case the muic notifies cable attach or dry signal,
1832 * or the water chk cnt is over,
1833 * or ccic already detected the water.
1835 if (!pdic_data
->is_muic_water_detect
1836 || pdic_data
->water_detect_cnt
> WATER_CHK_RETRY_CNT
1837 || pdic_data
->is_water_detect
) {
1838 pr_info("%s: detect handler is canceled", __func__
);
1842 s2mu106_set_water_detect_pre_cond(pdic_data
);
1843 s2mu106_set_water_1st_detect(pdic_data
);
1846 if (s2mu106_get_plug_monitor(pdic_data
, cc_val
) < 0) {
1847 pr_err("%s Failed to get the plug monitor.\n", __func__
);
1848 goto WATER_MODE_OUT
;
1851 if (IS_CC_WATER(cc_val
[0], cc_val
[1])) {
1852 pr_info("%s, water is detected, cc1 : 0x%X, cc2 : 0x%X\n",
1853 __func__
, cc_val
[0], cc_val
[1]);
1854 _S2MU106_PDIC_enter_to_water(pdic_data
);
1855 goto WATER_MODE_OUT
;
1857 pr_info("%s, 1st chk is not water, cc1 : 0x%X, cc2 : 0x%X\n",
1858 __func__
, cc_val
[0], cc_val
[1]);
1859 if (s2mu106_is_water_detected_2nd_seq(pdic_data
, cc_val
)) {
1860 pr_info("%s, 2nd seq, water is detected, cc1 : 0x%X, cc2 : 0x%X\n",
1861 __func__
, cc_val
[0], cc_val
[1]);
1862 _S2MU106_PDIC_enter_to_water(pdic_data
);
1863 goto WATER_MODE_OUT
;
1866 pr_info("%s, 2nd chk : not water, cc1 : 0x%X, cc2 : 0x%X\n",
1867 __func__
, cc_val
[0], cc_val
[1]);
1869 if (pdic_data
->water_detect_cnt
++ >= WATER_CHK_RETRY_CNT
) {
1870 pdic_data
->is_water_detect
= false;
1871 pdic_data
->water_detect_cnt
= 0;
1872 #if defined(CONFIG_CCIC_NOTIFIER)
1873 ccic_event_work(pdic_data
,
1874 CCIC_NOTIFY_DEV_MUIC
, CCIC_NOTIFY_ID_WATER
, CCIC_NOTIFY_DETACH
, 0);
1878 * Retry the cc check,
1879 * in case of invalid status.
1880 * (200ms interval + 175ms check duration) * 5 times
1882 cancel_delayed_work(&pdic_data
->water_detect_handler
);
1883 schedule_delayed_work(&pdic_data
->water_detect_handler
,
1884 msecs_to_jiffies(S2MU106_WATER_CHK_INTERVAL_TIME
));
1888 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_SET_RD
,
1889 S2MU106_THRESHOLD_428MV
);
1890 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_SET_RP
,
1891 S2MU106_THRESHOLD_2057MV
);
1893 mutex_unlock(&pdic_data
->_mutex
);
1897 static void S2MU106_PDIC_water_dry_handler(struct work_struct
*work
)
1899 struct s2mu106_usbpd_data
*pdic_data
=
1900 container_of(work
, struct s2mu106_usbpd_data
, water_dry_handler
.work
);
1901 struct i2c_client
*i2c
= pdic_data
->i2c
;
1902 u8 cc_val
[2] = {0,};
1904 pr_info("%s enter", __func__
);
1905 mutex_lock(&pdic_data
->_mutex
);
1907 s2mu106_set_water_detect_pre_cond(pdic_data
);
1908 s2mu106_set_water_1st_detect(pdic_data
);
1911 if (s2mu106_get_plug_monitor(pdic_data
, cc_val
) < 0) {
1912 pr_err("%s Failed to get the plug monitor.\n", __func__
);
1915 if (IS_CC_RP(cc_val
[0], cc_val
[1])) {
1916 pr_info("%s, 1st, water DRY is detected, cc1 : 0x%X, cc2 : 0x%X\n",
1917 __func__
, cc_val
[0], cc_val
[1]);
1919 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_SET_RD
,
1920 S2MU106_THRESHOLD_428MV
);
1921 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_SET_RP
,
1922 S2MU106_THRESHOLD_2057MV
);
1923 #if defined(CONFIG_CCIC_NOTIFIER)
1924 ccic_event_work(pdic_data
,
1925 CCIC_NOTIFY_DEV_MUIC
, CCIC_NOTIFY_ID_WATER
, CCIC_NOTIFY_DETACH
, 0);
1928 pr_info("%s, It is not DRIED yet, cc1 : 0x%X, cc2 : 0x%X\n",
1929 __func__
, cc_val
[0], cc_val
[1]);
1931 #if defined(CONFIG_CCIC_NOTIFIER)
1932 ccic_event_work(pdic_data
,
1933 CCIC_NOTIFY_DEV_MUIC
, CCIC_NOTIFY_ID_WATER
, CCIC_NOTIFY_ATTACH
, 0);
1935 s2mu106_set_lpm_mode(pdic_data
);
1936 s2mu106_usbpd_update_bit(i2c
, S2MU106_REG_PD_CTRL
,
1937 S2MU106_REG_LPM_EN
, 0, 0);
1940 mutex_unlock(&pdic_data
->_mutex
);
1944 static void s2mu106_usbpd_otg_attach(struct s2mu106_usbpd_data
*pdic_data
)
1946 struct i2c_client
*i2c
= pdic_data
->i2c
;
1947 struct device
*dev
= &i2c
->dev
;
1950 pdic_data
->is_host
= HOST_ON
;
1951 #if defined(CONFIG_DUAL_ROLE_USB_INTF)
1952 pdic_data
->power_role_dual
= DUAL_ROLE_PROP_PR_SRC
;
1953 #elif defined(CONFIG_TYPEC)
1954 pdic_data
->typec_power_role
= TYPEC_SOURCE
;
1955 typec_set_pwr_role(pdic_data
->port
, pdic_data
->typec_power_role
);
1957 #if defined(CONFIG_IFCONN_NOTIFIER)
1959 ifconn_event_work(pdic_data
, IFCONN_NOTIFY_USB
, IFCONN_NOTIFY_ID_USB
,
1960 IFCONN_NOTIFY_EVENT_USB_ATTACH_DFP
, NULL
);
1962 #ifdef CONFIG_PM_S2MU106
1963 s2mu106_usbpd_check_vbus(pdic_data
, 80, VBUS_OFF
);
1965 /* add to turn on external 5V */
1966 vbus_turn_on_ctrl(pdic_data
, VBUS_ON
);
1968 usbpd_manager_acc_handler_cancel(dev
);
1971 #if defined(CONFIG_MUIC_NOTIFIER)
1972 static int type3_handle_notification(struct notifier_block
*nb
,
1973 unsigned long action
, void *data
)
1975 #if defined(CONFIG_CCIC_NOTIFIER)
1976 CC_NOTI_ATTACH_TYPEDEF
*p_noti
= (CC_NOTI_ATTACH_TYPEDEF
*)data
;
1977 muic_attached_dev_t attached_dev
= p_noti
->cable_type
;
1979 muic_attached_dev_t attached_dev
= *(muic_attached_dev_t
*)data
;
1981 struct s2mu106_usbpd_data
*pdic_data
=
1982 container_of(nb
, struct s2mu106_usbpd_data
,
1984 struct i2c_client
*i2c
= pdic_data
->i2c
;
1987 #if (defined(CONFIG_USB_HW_PARAM) && !defined(CONFIG_USB_TYPEC_MANAGER_NOTIFIER)) || \
1988 (!defined(CONFIG_SEC_FACTORY) && defined(CONFIG_USB_HOST_NOTIFY))
1989 struct otg_notify
*o_notify
= get_otg_notify();
1991 mutex_lock(&pdic_data
->lpm_mutex
);
1992 pr_info("%s action:%d, attached_dev:%d, lpm:%d, pdic_data->is_otg_vboost:%d, pdic_data->is_otg_reboost:%d\n",
1993 __func__
, (int)action
, (int)attached_dev
, pdic_data
->lpm_mode
,
1994 (int)pdic_data
->is_otg_vboost
, (int)pdic_data
->is_otg_reboost
);
1996 if ((action
== MUIC_PDIC_NOTIFY_CMD_ATTACH
) &&
1997 (attached_dev
== ATTACHED_DEV_TYPE3_MUIC
)) {
1998 pdic_data
->is_muic_water_detect
= false;
1999 pdic_data
->water_detect_cnt
= 0;
2000 if (pdic_data
->lpm_mode
) {
2001 pr_info("%s try to exit lpm mode-->\n", __func__
);
2002 s2mu106_set_normal_mode(pdic_data
);
2003 pr_info("%s after exit lpm mode<--\n", __func__
);
2005 } else if ((action
== MUIC_PDIC_NOTIFY_CMD_ATTACH
) &&
2006 attached_dev
== ATTACHED_DEV_CHK_WATER_REQ
) {
2007 pr_info("%s, ATTACH : MUIC REQUESTED WATER CHECK\n", __func__
);
2008 s2mu106_usbpd_set_vconn_manual(pdic_data
, true);
2009 pdic_data
->is_muic_water_detect
= true;
2010 pdic_data
->water_detect_cnt
= 0;
2011 pdic_data
->is_water_detect
= false;
2012 cancel_delayed_work(&pdic_data
->water_detect_handler
);
2013 schedule_delayed_work(&pdic_data
->water_detect_handler
, msecs_to_jiffies(100));
2014 } else if ((action
== MUIC_PDIC_NOTIFY_CMD_ATTACH
) &&
2015 attached_dev
== ATTACHED_DEV_CHK_WATER_DRY_REQ
) {
2016 pr_info("%s, ATTACH : MUIC REQUESTED WATER DRY CHECK\n", __func__
);
2017 cancel_delayed_work(&pdic_data
->water_dry_handler
);
2018 schedule_delayed_work(&pdic_data
->water_dry_handler
, msecs_to_jiffies(100));
2019 } else if ((action
== MUIC_PDIC_NOTIFY_CMD_ATTACH
) &&
2020 attached_dev
== ATTACHED_DEV_OTG_MUIC
) {
2021 s2mu106_usbpd_otg_attach(pdic_data
);
2022 } else if ((action
== MUIC_PDIC_NOTIFY_CMD_DETACH
) &&
2023 attached_dev
== ATTACHED_DEV_UNDEFINED_RANGE_MUIC
) {
2024 pr_info("%s, DETACH : ATTACHED_DEV_UNDEFINED_RANGE_MUIC(Water DRY)\n", __func__
);
2025 pdic_data
->is_muic_water_detect
= false;
2026 pdic_data
->water_detect_cnt
= 0;
2027 pdic_data
->is_water_detect
= false;
2028 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PD_CTRL
, ®_data
);
2029 reg_data
|= S2MU106_REG_LPM_EN
;
2030 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PD_CTRL
, reg_data
);
2031 #if defined(CONFIG_USB_HW_PARAM) && !defined(CONFIG_USB_TYPEC_MANAGER_NOTIFIER)
2033 inc_hw_param(o_notify
, USB_CCIC_DRY_INT_COUNT
);
2035 #if defined(CONFIG_CCIC_NOTIFIER)
2036 ccic_event_work(pdic_data
,
2037 CCIC_NOTIFY_DEV_MUIC
, CCIC_NOTIFY_ID_WATER
, CCIC_NOTIFY_DETACH
, 0);
2039 } else if (action
== MUIC_PDIC_NOTIFY_CMD_DETACH
) {
2040 if (!pdic_data
->lpm_mode
) {
2041 pr_info("%s try to enter lpm mode-->\n", __func__
);
2042 s2mu106_set_lpm_mode(pdic_data
);
2043 pr_info("%s after enter lpm mode<--\n", __func__
);
2046 #if !defined(CONFIG_SEC_FACTORY) && defined(CONFIG_USB_HOST_NOTIFY)
2047 else if ((action
== MUIC_PDIC_NOTIFY_CMD_ATTACH
)
2048 && (attached_dev
== ATTACHED_DEV_CHECK_OCP
)
2049 && pdic_data
->is_otg_vboost
2050 && pdic_data
->data_role_dual
==
2051 IFCONN_NOTIFY_EVENT_USB_ATTACH_DFP
) {
2053 if (is_blocked(o_notify
, NOTIFY_BLOCK_TYPE_HOST
)) {
2054 pr_info("%s, upsm mode, skip OCP handling\n", __func__
);
2058 if (pdic_data
->is_otg_reboost
) {
2059 /* todo : over current event to platform */
2060 pr_info("%s, CHECK_OCP, Can't afford it(OVERCURRENT)\n", __func__
);
2062 send_otg_notify(o_notify
, NOTIFY_EVENT_OVERCURRENT
, 0);
2065 ccic_event_work(pdic_data
,
2066 CCIC_NOTIFY_DEV_MUIC
, CCIC_NOTIFY_ID_ATTACH
, 1/*attach*/, 1/*rprd*/);
2068 pr_info("%s, CHECK_OCP, start OCP W/A\n", __func__
);
2069 pdic_data
->is_otg_reboost
= true;
2070 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL_CC_HOLD
, ®_data
);
2071 reg_data
|= S2MU106_REG_PLUG_CTRL_CC_HOLD_BIT
;
2072 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_CC_HOLD
, reg_data
);
2074 s2mu106_usbpd_set_rp_scr_sel(pdic_data
, PLUG_CTRL_RP80
);
2075 vbus_turn_on_ctrl(pdic_data
, VBUS_OFF
);
2076 vbus_turn_on_ctrl(pdic_data
, VBUS_ON
);
2078 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL_CC_HOLD
, ®_data
);
2079 reg_data
&= ~S2MU106_REG_PLUG_CTRL_CC_HOLD_BIT
;
2080 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_CC_HOLD
, reg_data
);
2084 mutex_unlock(&pdic_data
->lpm_mutex
);
2090 static void s2mu106_usbpd_prevent_watchdog_reset(
2091 struct s2mu106_usbpd_data
*pdic_data
)
2093 struct i2c_client
*i2c
= pdic_data
->i2c
;
2096 mutex_lock(&pdic_data
->lpm_mutex
);
2097 wake_lock(&pdic_data
->wake_lock
);
2098 if (!pdic_data
->lpm_mode
) {
2099 if (s2mu106_usbpd_lpm_check(pdic_data
) == 0) {
2100 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_INT_STATUS2
, &val
);
2101 s2mu106_usbpd_set_vbus_wakeup(pdic_data
, VBUS_WAKEUP_DISABLE
);
2102 pr_info("%s force to lpm mode\n", __func__
);
2103 s2mu106_usbpd_set_mode(pdic_data
, PD_LPM_MODE
);
2104 /* enable wakeup to check prevent function */
2105 s2mu106_set_irq_enable(pdic_data
, ENABLED_INT_0
, ENABLED_INT_1
,
2106 ENABLED_INT_2_WAKEUP
, ENABLED_INT_3
, ENABLED_INT_4
,
2108 s2mu106_usbpd_set_vbus_wakeup(pdic_data
, VBUS_WAKEUP_ENABLE
);
2109 usleep_range(1000, 1200);
2110 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_INT_STATUS2
, &val
);
2111 if (val
& S2MU106_REG_INT_STATUS2_WAKEUP
)
2112 pr_info("%s auto wakeup success\n", __func__
);
2115 s2mu106_usbpd_set_vbus_wakeup(pdic_data
, VBUS_WAKEUP_DISABLE
);
2116 usleep_range(1000, 1200);
2117 s2mu106_usbpd_set_vbus_wakeup(pdic_data
, VBUS_WAKEUP_ENABLE
);
2118 usleep_range(1000, 1200);
2119 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_INT_STATUS2
, &val
);
2120 if (val
& S2MU106_REG_INT_STATUS2_WAKEUP
)
2121 pr_info("%s auto wakeup success\n", __func__
);
2123 s2mu106_usbpd_set_mode(pdic_data
, PD_NORMAL_MODE
);
2126 s2mu106_set_irq_enable(pdic_data
, ENABLED_INT_0
, ENABLED_INT_1
,
2127 ENABLED_INT_2
, ENABLED_INT_3
, ENABLED_INT_4
,
2131 wake_unlock(&pdic_data
->wake_lock
);
2132 mutex_unlock(&pdic_data
->lpm_mutex
);
2135 static int s2mu106_usbpd_check_abnormal_attach(struct s2mu106_usbpd_data
*pdic_data
)
2137 struct i2c_client
*i2c
= pdic_data
->i2c
;
2140 pr_info("%s, try 771mV\n", __func__
);
2142 s2mu106_usbpd_set_threshold(pdic_data
, PLUG_CTRL_RP
, S2MU106_THRESHOLD_771MV
);
2145 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_MON2
, &data
);
2146 if ((data
& S2MU106_PR_MASK
) == S2MU106_PDIC_SOURCE
)
2152 static void s2mu106_usbpd_rp_current_check(struct s2mu106_usbpd_data
*pdic_data
)
2154 struct i2c_client
*i2c
= pdic_data
->i2c
;
2155 struct device
*dev
= pdic_data
->dev
;
2157 u8 cc1_val
= 0, cc2_val
= 0;
2158 u8 rp_currentlvl
= 0;
2160 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_FSM_MON
, &val
);
2162 cc1_val
= val
& S2MU106_REG_CTRL_MON_CC1_MASK
;
2163 cc2_val
= (val
& S2MU106_REG_CTRL_MON_CC2_MASK
) >> S2MU106_REG_CTRL_MON_CC2_SHIFT
;
2165 dev_info(dev
, "%s, rp check : cc1_val(%x), cc2_val(%x)\n",
2166 __func__
, cc1_val
, cc2_val
);
2168 if (cc1_val
== USBPD_10k
|| cc2_val
== USBPD_10k
)
2169 rp_currentlvl
= RP_CURRENT_LEVEL3
;
2170 else if (cc1_val
== USBPD_22k
|| cc2_val
== USBPD_22k
)
2171 rp_currentlvl
= RP_CURRENT_LEVEL2
;
2172 else if (cc1_val
== USBPD_56k
|| cc2_val
== USBPD_56k
)
2173 rp_currentlvl
= RP_CURRENT_LEVEL_DEFAULT
;
2175 pd_noti
.sink_status
.rp_currentlvl
= rp_currentlvl
;
2176 pd_noti
.event
= IFCONN_NOTIFY_EVENT_RP_ATTACH
;
2177 ifconn_event_work(pdic_data
, IFCONN_NOTIFY_MANAGER
,
2178 IFCONN_NOTIFY_ID_POWER_STATUS
, IFCONN_NOTIFY_EVENT_ATTACH
, &pd_noti
);
2181 static void s2mu106_usbpd_detach_init(struct s2mu106_usbpd_data
*pdic_data
)
2183 struct device
*dev
= pdic_data
->dev
;
2184 struct usbpd_data
*pd_data
= dev_get_drvdata(dev
);
2187 dev_info(dev
, "%s\n", __func__
);
2189 mutex_lock(&pdic_data
->cc_mutex
);
2190 s2mu106_usbpd_set_cc_control(pdic_data
, USBPD_CC_OFF
);
2191 #if defined(CONFIG_DUAL_ROLE_USB_INTF)
2192 if (pdic_data
->power_role_dual
== DUAL_ROLE_PROP_PR_SRC
) {
2193 vbus_turn_on_ctrl(pdic_data
, VBUS_OFF
);
2195 #elif defined(CONFIG_TYPEC)
2196 if (pdic_data
->typec_power_role
== TYPEC_SOURCE
) {
2197 vbus_turn_on_ctrl(pdic_data
, VBUS_OFF
);
2199 pd_data
->pd_support
= 0;
2201 pdic_data
->detach_valid
= true;
2202 mutex_unlock(&pdic_data
->cc_mutex
);
2203 usbpd_manager_plug_detach(dev
, 0);
2205 /* wait flushing policy engine work */
2206 usbpd_cancel_policy_work(dev
);
2207 s2mu106_self_soft_reset(pdic_data
->i2c
);
2209 pdic_data
->status_reg
= 0;
2211 pdic_data
->rid
= REG_RID_MAX
;
2212 pdic_data
->check_rid_wa
= false;
2213 pdic_data
->is_factory_mode
= false;
2214 pdic_data
->is_pr_swap
= false;
2215 if (pdic_data
->regulator_en
)
2216 ret
= regulator_disable(pdic_data
->regulator
);
2217 #ifdef CONFIG_BATTERY_SAMSUNG
2218 #ifdef CONFIG_USB_TYPEC_MANAGER_NOTIFIER
2219 pd_noti
.sink_status
.current_pdo_num
= 0;
2220 pd_noti
.sink_status
.selected_pdo_num
= 0;
2221 pd_noti
.sink_status
.rp_currentlvl
= RP_CURRENT_LEVEL_NONE
;
2224 s2mu106_usbpd_reg_init(pdic_data
);
2225 s2mu106_set_vconn_source(pd_data
, USBPD_VCONN_OFF
);
2228 static void s2mu106_usbpd_notify_detach(struct s2mu106_usbpd_data
*pdic_data
)
2230 struct device
*dev
= pdic_data
->dev
;
2231 #if defined(CONFIG_IFCONN_NOTIFIER)
2233 ifconn_event_work(pdic_data
, IFCONN_NOTIFY_MUIC
, IFCONN_NOTIFY_ID_ATTACH
,
2234 IFCONN_NOTIFY_EVENT_DETACH
, NULL
);
2236 ifconn_event_work(pdic_data
, IFCONN_NOTIFY_MUIC
, IFCONN_NOTIFY_ID_RID
,
2237 IFCONN_NOTIFY_EVENT_DETACH
, NULL
);
2239 if (pdic_data
->is_host
> HOST_OFF
|| pdic_data
->is_client
> CLIENT_OFF
) {
2240 #if defined(CONFIG_DUAL_ROLE_USB_INTF)
2241 if (pdic_data
->is_host
> HOST_OFF
||
2242 pdic_data
->power_role_dual
== DUAL_ROLE_PROP_PR_SRC
) {
2244 if (pdic_data
->is_host
> HOST_OFF
) {
2246 vbus_turn_on_ctrl(pdic_data
, VBUS_OFF
);
2248 usbpd_manager_acc_detach(dev
);
2250 dev_info(dev
, "%s %d: is_host = %d, is_client = %d\n", __func__
,
2251 __LINE__
, pdic_data
->is_host
, pdic_data
->is_client
);
2252 pdic_data
->is_host
= HOST_OFF
;
2253 pdic_data
->is_client
= CLIENT_OFF
;
2254 #if defined(CONFIG_DUAL_ROLE_USB_INTF)
2255 pdic_data
->power_role_dual
= DUAL_ROLE_PROP_PR_NONE
;
2256 #elif defined(CONFIG_TYPEC)
2257 if (pdic_data
->partner
) {
2258 pr_info("%s, %d\n", __func__
, __LINE__
);
2259 if (!IS_ERR(pdic_data
->partner
)) {
2260 typec_unregister_partner(pdic_data
->partner
);
2261 pdic_data
->partner
= NULL
;
2264 pdic_data
->typec_power_role
= TYPEC_SINK
;
2265 pdic_data
->typec_data_role
= TYPEC_DEVICE
;
2268 ifconn_event_work(pdic_data
, IFCONN_NOTIFY_USB
, IFCONN_NOTIFY_ID_USB
,
2269 IFCONN_NOTIFY_EVENT_DETACH
, NULL
);
2272 usbpd_manager_plug_detach(dev
, 1);
2275 #ifdef CONFIG_CCIC_TRY_SNK
2276 static void s2mu106_usbpd_try_snk(struct s2mu106_usbpd_data
*pdic_data
)
2278 struct device
*dev
= pdic_data
->dev
;
2279 struct i2c_client
*i2c
= pdic_data
->i2c
;
2281 u8 intr
[S2MU106_MAX_NUM_INT_STATUS
] = {0};
2283 dev_info(dev
, "%s\n", __func__
);
2285 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL_PORT
, &data
);
2286 data
&= ~S2MU106_REG_PLUG_CTRL_MODE_MASK
;
2287 data
|= S2MU106_REG_PLUG_CTRL_UFP
;
2288 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_PORT
, data
);
2292 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_MON2
, &data
);
2293 if ((data
& S2MU106_PR_MASK
) != S2MU106_PDIC_SINK
) {
2294 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL_PORT
, &data
);
2295 data
&= ~S2MU106_REG_PLUG_CTRL_MODE_MASK
;
2296 data
|= S2MU106_REG_PLUG_CTRL_DFP
;
2297 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_PORT
, data
);
2302 s2mu106_usbpd_bulk_read(i2c
, S2MU106_REG_INT_STATUS0
,
2303 S2MU106_MAX_NUM_INT_STATUS
, intr
);
2306 static void s2mu106_usbpd_check_host(struct s2mu106_usbpd_data
*pdic_data
,
2307 CCIC_HOST_REASON host
)
2309 if (host
== HOST_ON
&& pdic_data
->is_host
== HOST_ON
) {
2310 dev_info(pdic_data
->dev
, "%s %d: turn off host\n", __func__
, __LINE__
);
2311 ifconn_event_work(pdic_data
, IFCONN_NOTIFY_MUIC
,
2312 IFCONN_NOTIFY_ID_ATTACH
, IFCONN_NOTIFY_EVENT_DETACH
, NULL
);
2313 #if defined(CONFIG_DUAL_ROLE_USB_INTF)
2314 pdic_data
->power_role_dual
= DUAL_ROLE_PROP_PR_NONE
;
2315 #elif defined(CONFIG_TYPEC)
2316 pdic_data
->typec_power_role
= TYPEC_SINK
;
2317 typec_set_pwr_role(pdic_data
->port
, pdic_data
->typec_power_role
);
2319 /* add to turn off external 5V */
2320 vbus_turn_on_ctrl(pdic_data
, VBUS_OFF
);
2321 ifconn_event_work(pdic_data
, IFCONN_NOTIFY_USB
, IFCONN_NOTIFY_ID_USB
,
2322 IFCONN_NOTIFY_EVENT_DETACH
, NULL
);
2323 pdic_data
->is_host
= HOST_OFF
;
2325 } else if (host
== HOST_OFF
&& pdic_data
->is_host
== HOST_OFF
) {
2327 ifconn_event_work(pdic_data
, IFCONN_NOTIFY_MUIC
,
2328 IFCONN_NOTIFY_ID_OTG
, IFCONN_NOTIFY_EVENT_ATTACH
, NULL
);
2329 s2mu106_usbpd_otg_attach(pdic_data
);
2333 static void s2mu106_usbpd_check_client(struct s2mu106_usbpd_data
*pdic_data
,
2334 CCIC_DEVICE_REASON client
)
2336 if (client
== CLIENT_ON
&& pdic_data
->is_client
== CLIENT_ON
) {
2337 dev_info(pdic_data
->dev
, "%s %d: turn off client\n", __func__
, __LINE__
);
2338 ifconn_event_work(pdic_data
, IFCONN_NOTIFY_MUIC
,
2339 IFCONN_NOTIFY_ID_ATTACH
, IFCONN_NOTIFY_EVENT_DETACH
, NULL
);
2340 #if defined(CONFIG_DUAL_ROLE_USB_INTF)
2341 pdic_data
->power_role_dual
= DUAL_ROLE_PROP_PR_NONE
;
2342 #elif defined(CONFIG_TYPEC)
2343 pdic_data
->typec_power_role
= TYPEC_SINK
;
2344 typec_set_pwr_role(pdic_data
->port
, pdic_data
->typec_power_role
);
2346 ifconn_event_work(pdic_data
, IFCONN_NOTIFY_USB
,
2347 IFCONN_NOTIFY_ID_USB
, IFCONN_NOTIFY_EVENT_DETACH
, NULL
);
2348 pdic_data
->is_client
= CLIENT_OFF
;
2352 static int s2mu106_check_port_detect(struct s2mu106_usbpd_data
*pdic_data
)
2354 struct i2c_client
*i2c
= pdic_data
->i2c
;
2355 struct device
*dev
= &i2c
->dev
;
2356 struct usbpd_data
*pd_data
= dev_get_drvdata(dev
);
2358 u8 cc1_val
= 0, cc2_val
= 0;
2361 ret
= s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_MON2
, &data
);
2363 dev_err(dev
, "%s, i2c read PLUG_MON2 error\n", __func__
);
2365 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_MON1
, &val
);
2367 cc1_val
= val
& S2MU106_REG_CTRL_MON_CC1_MASK
;
2368 cc2_val
= (val
& S2MU106_REG_CTRL_MON_CC2_MASK
) >> S2MU106_REG_CTRL_MON_CC2_SHIFT
;
2370 pdic_data
->cc1_val
= cc1_val
;
2371 pdic_data
->cc2_val
= cc2_val
;
2373 dev_info(dev
, "%s, attach cc pin check cc1_val(%x), cc2_val(%x)\n",
2374 __func__
, cc1_val
, cc2_val
);
2376 #ifdef CONFIG_CCIC_DP
2377 if (cc1_val
== USBPD_Rd
)
2378 gpio_direction_output(pdic_data
->usb_sw_sel
, 1);
2379 else if (cc2_val
== USBPD_Rd
)
2380 gpio_direction_output(pdic_data
->usb_sw_sel
, 0);
2382 #ifdef CONFIG_CCIC_TRY_SNK
2383 if ((data
& S2MU106_PR_MASK
) == S2MU106_PDIC_SOURCE
) {
2384 #if defined(CONFIG_DUAL_ROLE_USB_INTF)
2385 if (!pdic_data
->try_state_change
) {
2386 s2mu106_usbpd_try_snk(pdic_data
);
2387 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_MON2
, &data
);
2390 s2mu106_usbpd_try_snk(pdic_data
);
2391 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_MON2
, &data
);
2395 if ((data
& S2MU106_PR_MASK
) == S2MU106_PDIC_SINK
) {
2396 dev_info(dev
, "SINK\n");
2397 pdic_data
->detach_valid
= false;
2398 pdic_data
->power_role
= PDIC_SINK
;
2399 pdic_data
->data_role
= USBPD_UFP
;
2402 s2mu106_usbpd_prevent_watchdog_reset(pdic_data
);
2403 usbpd_policy_reset(pd_data
, PLUG_EVENT
);
2404 #if defined(CONFIG_IFCONN_NOTIFIER)
2405 dev_info(&i2c
->dev
, "%s %d: is_host = %d, is_client = %d\n", __func__
,
2406 __LINE__
, pdic_data
->is_host
, pdic_data
->is_client
);
2407 if (pdic_data
->regulator_en
) {
2408 ret
= regulator_enable(pdic_data
->regulator
);
2410 dev_err(&i2c
->dev
, "Failed to enable vconn LDO: %d\n", ret
);
2413 s2mu106_usbpd_check_host(pdic_data
, HOST_ON
);
2415 ifconn_event_work(pdic_data
, IFCONN_NOTIFY_MUIC
,
2416 IFCONN_NOTIFY_ID_ATTACH
, IFCONN_NOTIFY_EVENT_ATTACH
, NULL
);
2417 ifconn_event_work(pdic_data
, IFCONN_NOTIFY_MUIC
,
2418 IFCONN_NOTIFY_ID_TA
, IFCONN_NOTIFY_EVENT_ATTACH
, NULL
);
2419 if (!(pdic_data
->rid
== REG_RID_523K
|| pdic_data
->rid
== REG_RID_619K
)) {
2420 if (pdic_data
->is_client
== CLIENT_OFF
&& pdic_data
->is_host
== HOST_OFF
) {
2422 pdic_data
->is_client
= CLIENT_ON
;
2423 #if defined(CONFIG_DUAL_ROLE_USB_INTF)
2424 pdic_data
->power_role_dual
= DUAL_ROLE_PROP_PR_SNK
;
2425 #elif defined(CONFIG_TYPEC)
2426 pdic_data
->typec_power_role
= TYPEC_SINK
;
2427 typec_set_pwr_role(pdic_data
->port
, pdic_data
->typec_power_role
);
2429 ifconn_event_work(pdic_data
,
2430 IFCONN_NOTIFY_USB
, IFCONN_NOTIFY_ID_USB
,
2431 IFCONN_NOTIFY_EVENT_USB_ATTACH_UFP
, NULL
);
2435 s2mu106_usbpd_rp_current_check(pdic_data
);
2436 } else if ((data
& S2MU106_PR_MASK
) == S2MU106_PDIC_SOURCE
) {
2437 dev_info(dev
, "SOURCE\n");
2438 ret
= s2mu106_usbpd_check_abnormal_attach(pdic_data
);
2440 dev_err(&i2c
->dev
, "%s, abnormal attach\n", __func__
);
2443 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_SET_RP
, S2MU106_THRESHOLD_2057MV
);
2444 ret
= s2mu106_usbpd_check_accessory(pdic_data
);
2446 dev_info(&i2c
->dev
, "%s attach accessory\n", __func__
);
2449 pdic_data
->detach_valid
= false;
2450 pdic_data
->power_role
= PDIC_SOURCE
;
2451 pdic_data
->data_role
= USBPD_DFP
;
2454 usbpd_policy_reset(pd_data
, PLUG_EVENT
);
2455 #if defined(CONFIG_IFCONN_NOTIFIER)
2456 dev_info(&i2c
->dev
, "%s %d: is_host = %d, is_client = %d\n", __func__
,
2457 __LINE__
, pdic_data
->is_host
, pdic_data
->is_client
);
2458 s2mu106_usbpd_check_client(pdic_data
, CLIENT_ON
);
2459 s2mu106_usbpd_check_host(pdic_data
, HOST_OFF
);
2461 if (pdic_data
->regulator_en
) {
2462 ret
= regulator_enable(pdic_data
->regulator
);
2464 dev_err(&i2c
->dev
, "Failed to enable vconn LDO: %d\n", ret
);
2469 dev_err(dev
, "%s, PLUG Error\n", __func__
);
2470 #ifdef CONFIG_CCIC_TRY_SNK
2471 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL_PORT
, &data
);
2472 data
&= ~(S2MU106_REG_PLUG_CTRL_MODE_MASK
| S2MU106_REG_PLUG_CTRL_RP_SEL_MASK
);
2473 data
|= S2MU106_REG_PLUG_CTRL_DRP
| S2MU106_REG_PLUG_CTRL_RP80
;
2474 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_PORT
, data
);
2479 s2mu106_set_irq_enable(pdic_data
, ENABLED_INT_0
, ENABLED_INT_1
,
2480 ENABLED_INT_2
, ENABLED_INT_3
, ENABLED_INT_4
, ENABLED_INT_5
);
2485 #if defined(CONFIG_SEC_FACTORY)
2486 static int s2mu106_usbpd_check_619k(struct s2mu106_usbpd_data
*pdic_data
)
2490 if (pdic_data
->rid
!= REG_RID_619K
)
2494 s2mu106_usbpd_read_reg(pdic_data
->i2c
, S2MU106_REG_ADC_STATUS
, &rid
);
2495 rid
= (rid
& S2MU106_PDIC_RID_MASK
) >> S2MU106_PDIC_RID_SHIFT
;
2496 dev_info(pdic_data
->dev
, "%s %d: Detached, check if still 619K? => 0x%X\n",
2497 __func__
, __LINE__
, rid
);
2499 if (rid
== REG_RID_619K
)
2505 static irqreturn_t
s2mu106_irq_thread(int irq
, void *data
)
2507 struct s2mu106_usbpd_data
*pdic_data
= data
;
2508 struct i2c_client
*i2c
= pdic_data
->i2c
;
2509 struct device
*dev
= &i2c
->dev
;
2510 struct usbpd_data
*pd_data
= dev_get_drvdata(dev
);
2512 unsigned attach_status
= 0, rid_status
= 0;
2514 dev_info(dev
, "%s\n", __func__
);
2516 mutex_lock(&pd_data
->accept_mutex
);
2517 mutex_unlock(&pd_data
->accept_mutex
);
2519 mutex_lock(&pdic_data
->_mutex
);
2521 s2mu106_poll_status(pd_data
);
2523 #ifndef CONFIG_SEC_FACTORY
2524 if (pdic_data
->lpcharge_water
)
2528 if (pdic_data
->status_reg
== 0)
2531 if (s2mu106_get_status(pd_data
, MSG_SOFTRESET
))
2532 usbpd_rx_soft_reset(pd_data
);
2534 if (s2mu106_get_status(pd_data
, PLUG_DETACH
)) {
2535 #if defined(CONFIG_SEC_FACTORY)
2536 ret
= s2mu106_usbpd_check_619k(pdic_data
);
2539 #endif /* CONFIG_SEC_FACTORY */
2540 s2mu106_usbpd_set_rp_scr_sel(pdic_data
, PLUG_CTRL_RP80
);
2541 attach_status
= s2mu106_get_status(pd_data
, PLUG_ATTACH
);
2542 rid_status
= s2mu106_get_status(pd_data
, MSG_RID
);
2543 s2mu106_usbpd_detach_init(pdic_data
);
2544 s2mu106_usbpd_notify_detach(pdic_data
);
2545 if (attach_status
) {
2546 ret
= s2mu106_check_port_detect(pdic_data
);
2549 pdic_data
->check_rid_wa
= true;
2550 s2mu106_usbpd_check_rid(pdic_data
);
2556 mutex_lock(&pdic_data
->lpm_mutex
);
2557 if (!pdic_data
->lpm_mode
) {
2558 if (s2mu106_usbpd_lpm_check(pdic_data
) > 0) {
2559 pr_info("%s force to normal mode\n", __func__
);
2560 s2mu106_usbpd_set_mode(pdic_data
, PD_NORMAL_MODE
);
2562 s2mu106_set_irq_enable(pdic_data
, ENABLED_INT_0
, ENABLED_INT_1
,
2563 ENABLED_INT_2
, ENABLED_INT_3
, ENABLED_INT_4
, ENABLED_INT_5
);
2565 mutex_unlock(&pdic_data
->lpm_mutex
);
2570 if (s2mu106_get_status(pd_data
, MSG_HARDRESET
)) {
2571 mutex_lock(&pdic_data
->cc_mutex
);
2572 s2mu106_usbpd_set_cc_control(pdic_data
, USBPD_CC_OFF
);
2573 mutex_unlock(&pdic_data
->cc_mutex
);
2574 s2mu106_self_soft_reset(i2c
);
2575 pdic_data
->status_reg
= 0;
2576 if (pdic_data
->power_role
== PDIC_SOURCE
)
2580 usbpd_rx_hard_reset(dev
);
2581 usbpd_kick_policy_work(dev
);
2585 #if defined(CONFIG_SEC_FACTORY)
2587 #endif /* CONFIG_SEC_FACTORY */
2588 if (s2mu106_get_status(pd_data
, PLUG_ATTACH
) && !pdic_data
->is_pr_swap
) {
2589 if (s2mu106_check_port_detect(data
) < 0)
2593 if (s2mu106_get_status(pd_data
, MSG_RID
)) {
2594 pdic_data
->check_rid_wa
= true;
2595 s2mu106_usbpd_check_rid(pdic_data
);
2599 mutex_lock(&pdic_data
->lpm_mutex
);
2600 if (!pdic_data
->lpm_mode
)
2601 usbpd_kick_policy_work(dev
);
2602 mutex_unlock(&pdic_data
->lpm_mutex
);
2604 mutex_unlock(&pdic_data
->_mutex
);
2609 static void s2mu106_usbpd_plug_work(struct work_struct
*work
)
2611 struct s2mu106_usbpd_data
*pdic_data
=
2612 container_of(work
, struct s2mu106_usbpd_data
, plug_work
.work
);
2614 s2mu106_irq_thread(-1, pdic_data
);
2617 static void s2mu106_usbpd_dr_work(struct work_struct
*work
)
2619 struct s2mu106_usbpd_data
*usbpd_data
=
2620 container_of(work
, struct s2mu106_usbpd_data
, dr_work
.work
);
2621 struct i2c_client
*i2c
= usbpd_data
->i2c
;
2623 dev_info(&i2c
->dev
, "%s : before - is_host : %d, is_client : %d\n",
2624 __func__
, usbpd_data
->is_host
, usbpd_data
->is_client
);
2625 if (usbpd_data
->is_host
== HOST_ON
) {
2626 ifconn_event_work(usbpd_data
, IFCONN_NOTIFY_USB
,
2627 IFCONN_NOTIFY_ID_USB
, IFCONN_NOTIFY_EVENT_DETACH
, NULL
);
2629 ifconn_event_work(usbpd_data
, IFCONN_NOTIFY_USB
, IFCONN_NOTIFY_ID_USB
,
2630 IFCONN_NOTIFY_EVENT_USB_ATTACH_UFP
, NULL
);
2631 usbpd_data
->is_host
= HOST_OFF
;
2632 usbpd_data
->is_client
= CLIENT_ON
;
2633 } else if (usbpd_data
->is_client
== CLIENT_ON
) {
2634 ifconn_event_work(usbpd_data
, IFCONN_NOTIFY_USB
, IFCONN_NOTIFY_ID_USB
,
2635 IFCONN_NOTIFY_EVENT_DETACH
, NULL
);
2637 ifconn_event_work(usbpd_data
, IFCONN_NOTIFY_USB
, IFCONN_NOTIFY_ID_USB
,
2638 IFCONN_NOTIFY_EVENT_USB_ATTACH_DFP
, NULL
);
2639 usbpd_data
->is_host
= HOST_ON
;
2640 usbpd_data
->is_client
= CLIENT_OFF
;
2642 dev_info(&i2c
->dev
, "%s : after - is_host : %d, is_client : %d\n",
2643 __func__
, usbpd_data
->is_host
, usbpd_data
->is_client
);
2646 static int s2mu106_usbpd_get_property(struct power_supply
*psy
,
2647 enum power_supply_property psp
,
2648 union power_supply_propval
*val
)
2651 case POWER_SUPPLY_PROP_AUTHENTIC
:
2660 static int s2mu106_usbpd_set_property(struct power_supply
*psy
,
2661 enum power_supply_property psp
,
2662 const union power_supply_propval
*val
)
2664 struct s2mu106_usbpd_data
*pdic_data
=
2665 power_supply_get_drvdata(psy
);
2666 struct i2c_client
*i2c
= pdic_data
->i2c
;
2670 case POWER_SUPPLY_PROP_AUTHENTIC
:
2671 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL_VBUS_MUX
, &data
);
2672 data
&= ~(S2MU106_REG_RD_OR_VBUS_MUX_SEL
);
2673 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_VBUS_MUX
, data
);
2675 case POWER_SUPPLY_PROP_USBPD_RESET
:
2676 s2mu106_usbpd_set_vbus_wakeup(pdic_data
, VBUS_WAKEUP_DISABLE
);
2677 s2mu106_usbpd_set_vbus_wakeup(pdic_data
, VBUS_WAKEUP_ENABLE
);
2685 int s2mu106_usbpd_psy_init(struct s2mu106_usbpd_data
*_data
, struct device
*parent
)
2687 struct power_supply_config psy_cfg
= {};
2690 if (_data
== NULL
|| parent
== NULL
) {
2691 pr_err("%s NULL data\n", __func__
);
2695 _data
->ccic_desc
.name
= "s2mu106-usbpd";
2696 _data
->ccic_desc
.type
= POWER_SUPPLY_TYPE_UNKNOWN
;
2697 _data
->ccic_desc
.get_property
= s2mu106_usbpd_get_property
;
2698 _data
->ccic_desc
.set_property
= s2mu106_usbpd_set_property
;
2699 _data
->ccic_desc
.properties
= ccic_props
;
2700 _data
->ccic_desc
.num_properties
= ARRAY_SIZE(ccic_props
);
2702 psy_cfg
.drv_data
= _data
;
2703 psy_cfg
.supplied_to
= ccic_supplied_to
;
2704 psy_cfg
.num_supplicants
= ARRAY_SIZE(ccic_supplied_to
);
2706 _data
->psy_ccic
= power_supply_register(parent
, &_data
->ccic_desc
, &psy_cfg
);
2707 if (IS_ERR(_data
->psy_ccic
)) {
2708 ret
= (int)PTR_ERR(_data
->psy_ccic
);
2709 pr_err("%s: Failed to Register psy_ccic, ret : %d\n", __func__
, ret
);
2714 static int s2mu106_usbpd_reg_init(struct s2mu106_usbpd_data
*_data
)
2716 struct i2c_client
*i2c
= _data
->i2c
;
2719 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PHY_CTRL_IFG
, &data
);
2720 data
|= S2MU106_PHY_IFG_35US
<< S2MU106_REG_IFG_SHIFT
;
2721 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PHY_CTRL_IFG
, data
);
2723 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_MSG_SEND_CON
, &data
);
2724 data
|= S2MU106_REG_MSG_SEND_CON_HARD_EN
;
2725 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_MSG_SEND_CON
, data
);
2727 /* for SMPL issue */
2728 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_ANALOG_OTP_0A
, &data
);
2729 data
|= S2MU106_REG_OVP_ON
;
2730 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_ANALOG_OTP_0A
, data
);
2732 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PD_CTRL_2
, &data
);
2733 data
&= ~S2MU106_REG_CC_OCP_MASK
;
2734 data
|= S2MU106_CC_OCP_575MV
<< S2MU106_REG_CC_OCP_SHIFT
;
2735 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PD_CTRL_2
, data
);
2737 /* enable Rd monitor status when cc is attached at sink */
2738 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL_SET_MON
, &data
);
2739 data
|= S2MU106_REG_PLUG_CTRL_SET_MON_RD
;
2740 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_SET_MON
, data
);
2742 /* diable rd or vbus mux */
2743 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL_VBUS_MUX
, &data
);
2744 data
&= ~S2MU106_REG_RD_OR_VBUS_MUX_SEL
;
2745 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_VBUS_MUX
, data
);
2747 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PHY_CTRL_00
, 0x80);
2748 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_BMC_CTRL
, &data
);
2750 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_BMC_CTRL
, data
);
2752 /* set debounce time
2753 devide by 300 and unit is ms */
2754 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_CC_TIMER1
, 0xe4);
2755 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_CC_TIMER2
, 0x0c);
2757 /* enable support acc */
2758 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL_CC_HOLD
, &data
);
2759 data
|= S2MU106_REG_PLUG_CTRL_SUPPORT_ACC
;
2760 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_CC_HOLD
, data
);
2763 s2mu106_usbpd_read_reg(i2c
, 0x00, &data
);
2764 data
|= 0x1 | 0x3 << 2;
2765 s2mu106_usbpd_write_reg(i2c
, 0x00, data
);
2768 data
|= (S2MU106_REG_PLUG_CTRL_SSM_DISABLE
|
2769 S2MU106_REG_PLUG_CTRL_VDM_DISABLE
);
2770 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL
, data
);
2772 /* set Rd threshold to 400mV */
2773 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_SET_RD_2
, S2MU106_THRESHOLD_600MV
);
2774 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_SET_RP_2
, S2MU106_THRESHOLD_1200MV
);
2775 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_SET_RD
, S2MU106_THRESHOLD_300MV
| 0x40);
2776 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_SET_RP
, S2MU106_THRESHOLD_2057MV
);
2778 if (_data
->vconn_en
) {
2779 /* Off Manual Rd setup & On Manual Vconn setup */
2780 s2mu106_usbpd_read_reg(i2c
, S2MU106_REG_PLUG_CTRL_RpRd
, &data
);
2781 data
&= ~(S2MU106_REG_PLUG_CTRL_RpRd_MANUAL_EN_MASK
);
2782 data
|= S2MU106_REG_PLUG_CTRL_VCONN_MANUAL_EN
;
2783 s2mu106_usbpd_write_reg(i2c
, S2MU106_REG_PLUG_CTRL_RpRd
, data
);
2785 #ifdef CONFIG_PM_S2MU106
2786 s2mu106_usbpd_set_pmeter_mode(_data
, PM_TYPE_VCHGIN
);
2789 s2mu106_usbpd_set_vconn_manual(_data
, true);
2794 static irqreturn_t
s2mu106_irq_isr(int irq
, void *data
)
2796 return IRQ_WAKE_THREAD
;
2799 static int s2mu106_usbpd_irq_init(struct s2mu106_usbpd_data
*_data
)
2801 struct i2c_client
*i2c
= _data
->i2c
;
2802 struct device
*dev
= &i2c
->dev
;
2805 if (!_data
->irq_gpio
) {
2806 dev_err(dev
, "%s No interrupt specified\n", __func__
);
2810 /* s2mu106_usbpd_bulk_read(i2c, S2MU106_REG_INT_STATUS0,
2811 S2MU106_MAX_NUM_INT_STATUS, intr);
2813 pr_info("%s status[0x%x 0x%x 0x%x 0x%x 0x%x]\n",
2814 __func__, intr[0], intr[1], intr[2], intr[3], intr[4]);
2816 i2c
->irq
= gpio_to_irq(_data
->irq_gpio
);
2819 ret
= request_threaded_irq(i2c
->irq
, s2mu106_irq_isr
,
2821 (IRQF_TRIGGER_LOW
| IRQF_ONESHOT
| IRQF_NO_SUSPEND
),
2822 "s2mu106-usbpd", _data
);
2824 dev_err(dev
, "%s failed to request irq(%d)\n",
2825 __func__
, i2c
->irq
);
2829 ret
= enable_irq_wake(i2c
->irq
);
2831 dev_err(dev
, "%s failed to enable wakeup src\n",
2835 if (_data
->lpm_mode
)
2836 s2mu106_set_irq_enable(_data
, 0, 0, 0, 0, 0, 0);
2838 s2mu106_set_irq_enable(_data
, ENABLED_INT_0
, ENABLED_INT_1
,
2839 ENABLED_INT_2
, ENABLED_INT_3
, ENABLED_INT_4
, ENABLED_INT_5
);
2844 static void s2mu106_usbpd_init_configure(struct s2mu106_usbpd_data
*_data
)
2846 s2mu106_usbpd_test_read(_data
);
2847 s2mu106_usbpd_get_pmeter_volt(_data
);
2848 s2mu106_usbpd_get_pmeter_current(_data
);
2849 pr_info("%s, chgin(%d), chgin_i(%d)\n", __func__
,
2850 _data
->pm_chgin
, _data
->pm_chgin_i
);
2851 usbpd_charger_test_read(_data
);
2852 s2mu106_set_normal_mode(_data
);
2853 pr_info("%s, usbpd irq gpio value(%d)\n", __func__
,
2854 gpio_get_value(_data
->irq_gpio
));
2856 _data
->detach_valid
= true;
2857 s2mu106_self_soft_reset(_data
->i2c
);
2858 s2mu106_set_lpm_mode(_data
);
2859 _data
->detach_valid
= false;
2860 s2mu106_usbpd_set_cc_control(_data
, USBPD_CC_OFF
);
2861 _data
->lpm_mode
= true;
2862 if (_data
->pm_chgin
> 4800 && _data
->pm_chgin_i
> 1000)
2863 msleep(500); /* for abnormal PD TA */
2866 _data
->is_factory_mode
= false;
2867 s2mu106_set_normal_mode(_data
);
2868 _data
->lpm_mode
= false;
2871 static void s2mu106_usbpd_pdic_data_init(struct s2mu106_usbpd_data
*_data
)
2873 _data
->check_msg_pass
= false;
2874 _data
->vconn_source
= USBPD_VCONN_OFF
;
2875 _data
->rid
= REG_RID_MAX
;
2877 _data
->is_client
= 0;
2878 _data
->data_role_dual
= 0;
2879 _data
->power_role_dual
= 0;
2880 _data
->is_water_detect
= false;
2881 _data
->is_muic_water_detect
= false;
2882 _data
->detach_valid
= true;
2883 _data
->is_otg_vboost
= false;
2884 _data
->is_otg_reboost
= false;
2885 _data
->is_pr_swap
= false;
2886 _data
->vbus_access
= false;
2887 #ifndef CONFIG_SEC_FACTORY
2888 _data
->lpcharge_water
= false;
2890 _data
->check_rid_wa
= false;
2891 #if defined(CONFIG_TYPEC)
2892 _data
->typec_power_role
= TYPEC_SINK
;
2893 _data
->typec_data_role
= TYPEC_DEVICE
;
2897 static int of_s2mu106_dt(struct device
*dev
,
2898 struct s2mu106_usbpd_data
*_data
)
2900 struct device_node
*np_usbpd
= dev
->of_node
;
2903 if (np_usbpd
== NULL
) {
2904 dev_err(dev
, "%s np NULL\n", __func__
);
2907 _data
->irq_gpio
= of_get_named_gpio(np_usbpd
,
2908 "usbpd,usbpd_int", 0);
2909 if (_data
->irq_gpio
< 0) {
2910 dev_err(dev
, "error reading usbpd irq = %d\n",
2912 _data
->irq_gpio
= 0;
2914 ret
= gpio_get_value(_data
->irq_gpio
);
2915 pr_info("%s, usbpd irq gpio value(%d)\n", __func__
, ret
);
2916 if (of_find_property(np_usbpd
, "vconn-en", NULL
))
2917 _data
->vconn_en
= true;
2919 _data
->vconn_en
= false;
2921 if (of_find_property(np_usbpd
, "regulator-en", NULL
))
2922 _data
->regulator_en
= true;
2924 _data
->regulator_en
= false;
2925 #ifdef CONFIG_CCIC_DP
2926 _data
->usb_sw_sel
= of_get_named_gpio(np_usbpd
, "usb_sw_sel", 0);
2928 if (!gpio_is_valid(_data
->usb_sw_sel
))
2929 dev_err(dev
, "failed to get gpio usb_sw_sel\n");
2935 static int s2mu106_usbpd_probe(struct i2c_client
*i2c
,
2936 const struct i2c_device_id
*id
)
2938 struct i2c_adapter
*adapter
= to_i2c_adapter(i2c
->dev
.parent
);
2939 struct s2mu106_usbpd_data
*pdic_data
;
2940 struct device
*dev
= &i2c
->dev
;
2943 dev_info(dev
, "%s\n", __func__
);
2946 if (!i2c_check_functionality(adapter
, I2C_FUNC_SMBUS_BYTE_DATA
)) {
2947 dev_err(dev
, "%s: i2c functionality check error\n", __func__
);
2952 pdic_data
= kzalloc(sizeof(struct s2mu106_usbpd_data
), GFP_KERNEL
);
2954 dev_err(dev
, "%s: failed to allocate driver data\n", __func__
);
2959 /* save platfom data for gpio control functions */
2960 pdic_data
->dev
= &i2c
->dev
;
2961 pdic_data
->i2c
= i2c
;
2962 i2c_set_clientdata(i2c
, pdic_data
);
2964 ret
= of_s2mu106_dt(&i2c
->dev
, pdic_data
);
2966 dev_err(dev
, "%s: not found dt!\n", __func__
);
2968 mutex_init(&pdic_data
->_mutex
);
2969 mutex_init(&pdic_data
->lpm_mutex
);
2970 mutex_init(&pdic_data
->cc_mutex
);
2971 wake_lock_init(&pdic_data
->wake_lock
, WAKE_LOCK_SUSPEND
, "pdic_wake");
2973 #ifdef CONFIG_PM_S2MU106
2974 pdic_data
->psy_pm
= power_supply_get_by_name("s2mu106_pmeter");
2975 if (!pdic_data
->psy_pm
)
2976 pr_err("%s: Fail to get pmeter\n", __func__
);
2977 s2mu106_usbpd_set_pmeter_mode(pdic_data
, PM_TYPE_VCHGIN
);
2978 s2mu106_usbpd_set_pmeter_mode(pdic_data
, PM_TYPE_ICHGIN
);
2981 s2mu106_usbpd_init_configure(pdic_data
);
2982 s2mu106_usbpd_pdic_data_init(pdic_data
);
2984 if (pdic_data
->regulator_en
) {
2985 pdic_data
->regulator
= devm_regulator_get(dev
, "vconn");
2986 if (IS_ERR(pdic_data
->regulator
)) {
2987 dev_err(dev
, "%s: not found regulator vconn\n", __func__
);
2988 pdic_data
->regulator_en
= false;
2990 ret
= regulator_disable(pdic_data
->regulator
);
2993 ret
= usbpd_init(dev
, pdic_data
);
2995 dev_err(dev
, "failed on usbpd_init\n");
2999 usbpd_set_ops(dev
, &s2mu106_ops
);
3001 s2mu106_usbpd_reg_init(pdic_data
);
3003 pdic_data
->pdic_queue
=
3004 alloc_workqueue(dev_name(dev
), WQ_MEM_RECLAIM
, 1);
3005 if (!pdic_data
->pdic_queue
) {
3007 "%s: Fail to Create Workqueue\n", __func__
);
3011 #if defined(CONFIG_IFCONN_NOTIFIER)
3012 /* Create a work queue for the ccic irq thread */
3013 pdic_data
->ifconn_wq
3014 = create_singlethread_workqueue("ifconn_notify_event");
3015 if (!pdic_data
->ifconn_wq
) {
3016 pr_err("%s failed to create work queue for ccic notifier\n",
3021 if (pdic_data
->rid
== REG_RID_UNDF
)
3022 pdic_data
->rid
= REG_RID_MAX
;
3023 #if defined(CONFIG_TYPEC)
3024 ret
= typec_init(pdic_data
);
3026 pr_err("failed to init typec\n");
3031 ret
= s2mu106_usbpd_irq_init(pdic_data
);
3033 dev_err(dev
, "%s: failed to init irq(%d)\n", __func__
, ret
);
3036 INIT_DELAYED_WORK(&pdic_data
->water_detect_handler
, S2MU106_PDIC_water_detect_handler
);
3037 INIT_DELAYED_WORK(&pdic_data
->water_dry_handler
, S2MU106_PDIC_water_dry_handler
);
3038 INIT_DELAYED_WORK(&pdic_data
->water_dry_handler
, S2MU106_PDIC_water_dry_handler
);
3039 INIT_DELAYED_WORK(&pdic_data
->plug_work
, s2mu106_usbpd_plug_work
);
3040 INIT_DELAYED_WORK(&pdic_data
->dr_work
, s2mu106_usbpd_dr_work
);
3042 if (pdic_data
->detach_valid
) {
3043 mutex_lock(&pdic_data
->_mutex
);
3044 s2mu106_check_port_detect(pdic_data
);
3045 s2mu106_usbpd_check_rid(pdic_data
);
3046 mutex_unlock(&pdic_data
->_mutex
);
3049 s2mu106_irq_thread(-1, pdic_data
);
3051 #if defined(CONFIG_MUIC_NOTIFIER)
3052 muic_ccic_notifier_register(&pdic_data
->type3_nb
,
3053 type3_handle_notification
,
3054 MUIC_NOTIFY_DEV_PDIC
);
3056 #if defined(CONFIG_DUAL_ROLE_USB_INTF)
3057 ret
= dual_role_init(pdic_data
);
3059 pr_err("unable to allocate dual role descriptor\n");
3064 ret
= s2mu106_usbpd_psy_init(pdic_data
, &i2c
->dev
);
3066 pr_err("faled to register the ccic psy.\n");
3069 dev_info(dev
, "%s s2mu106 usbpd driver uploaded!\n", __func__
);
3075 free_irq(i2c
->irq
, pdic_data
);
3080 #if defined CONFIG_PM
3081 static int s2mu106_usbpd_suspend(struct device
*dev
)
3083 struct usbpd_data
*_data
= dev_get_drvdata(dev
);
3084 struct s2mu106_usbpd_data
*pdic_data
= _data
->phy_driver_data
;
3086 if (device_may_wakeup(dev
))
3087 enable_irq_wake(pdic_data
->i2c
->irq
);
3089 #ifndef CONFIG_SEC_FACTORY
3090 disable_irq(pdic_data
->i2c
->irq
);
3095 static int s2mu106_usbpd_resume(struct device
*dev
)
3097 struct usbpd_data
*_data
= dev_get_drvdata(dev
);
3098 struct s2mu106_usbpd_data
*pdic_data
= _data
->phy_driver_data
;
3100 if (device_may_wakeup(dev
))
3101 disable_irq_wake(pdic_data
->i2c
->irq
);
3103 #ifndef CONFIG_SEC_FACTORY
3104 enable_irq(pdic_data
->i2c
->irq
);
3109 #define s2mu106_muic_suspend NULL
3110 #define s2mu106_muic_resume NULL
3113 static int s2mu106_usbpd_remove(struct i2c_client
*i2c
)
3115 struct s2mu106_usbpd_data
*_data
= i2c_get_clientdata(i2c
);
3118 #if defined(CONFIG_DUAL_ROLE_USB_INTF)
3119 devm_dual_role_instance_unregister(_data
->dev
,
3121 devm_kfree(_data
->dev
, _data
->desc
);
3122 #elif defined(CONFIG_TYPEC)
3123 typec_unregister_port(_data
->port
);
3125 disable_irq_wake(_data
->i2c
->irq
);
3126 free_irq(_data
->i2c
->irq
, _data
);
3127 mutex_destroy(&_data
->_mutex
);
3128 i2c_set_clientdata(_data
->i2c
, NULL
);
3134 static const struct i2c_device_id s2mu106_usbpd_i2c_id
[] = {
3135 { USBPD_DEV_NAME
, 1 },
3138 MODULE_DEVICE_TABLE(i2c
, s2mu106_i2c_id
);
3140 static struct of_device_id sec_usbpd_i2c_dt_ids
[] = {
3141 { .compatible
= "sec-usbpd,i2c" },
3145 static void s2mu106_usbpd_shutdown(struct i2c_client
*i2c
)
3147 struct s2mu106_usbpd_data
*_data
= i2c_get_clientdata(i2c
);
3153 static usbpd_phy_ops_type s2mu106_ops
= {
3154 .tx_msg
= s2mu106_tx_msg
,
3155 .rx_msg
= s2mu106_rx_msg
,
3156 .hard_reset
= s2mu106_hard_reset
,
3157 .soft_reset
= s2mu106_soft_reset
,
3158 .set_power_role
= s2mu106_set_power_role
,
3159 .get_power_role
= s2mu106_get_power_role
,
3160 .set_data_role
= s2mu106_set_data_role
,
3161 .get_data_role
= s2mu106_get_data_role
,
3162 .set_vconn_source
= s2mu106_set_vconn_source
,
3163 .get_vconn_source
= s2mu106_get_vconn_source
,
3164 .set_check_msg_pass
= s2mu106_set_check_msg_pass
,
3165 .get_status
= s2mu106_get_status
,
3166 .poll_status
= s2mu106_poll_status
,
3167 .driver_reset
= s2mu106_driver_reset
,
3168 .set_otg_control
= s2mu106_set_otg_control
,
3169 .set_cc_control
= s2mu106_set_cc_control
,
3170 .cc_instead_of_vbus
= s2mu106_cc_instead_of_vbus
,
3171 .get_side_check
= s2mu106_get_side_check
,
3172 .pr_swap
= s2mu106_pr_swap
,
3173 .vbus_on_check
= s2mu106_vbus_on_check
,
3174 .set_pwr_opmode
= s2mu106_set_pwr_opmode
,
3175 .set_rp_control
= s2mu106_set_rp_control
,
3178 #if defined CONFIG_PM
3179 const struct dev_pm_ops s2mu106_usbpd_pm
= {
3180 .suspend
= s2mu106_usbpd_suspend
,
3181 .resume
= s2mu106_usbpd_resume
,
3185 static struct i2c_driver s2mu106_usbpd_driver
= {
3187 .name
= USBPD_DEV_NAME
,
3188 .of_match_table
= sec_usbpd_i2c_dt_ids
,
3189 #if defined CONFIG_PM
3190 .pm
= &s2mu106_usbpd_pm
,
3191 #endif /* CONFIG_PM */
3193 .probe
= s2mu106_usbpd_probe
,
3194 .remove
= s2mu106_usbpd_remove
,
3195 .shutdown
= s2mu106_usbpd_shutdown
,
3196 .id_table
= s2mu106_usbpd_i2c_id
,
3199 static int __init
s2mu106_usbpd_init(void)
3201 return i2c_add_driver(&s2mu106_usbpd_driver
);
3203 late_initcall(s2mu106_usbpd_init
);
3205 static void __exit
s2mu106_usbpd_exit(void)
3207 i2c_del_driver(&s2mu106_usbpd_driver
);
3209 module_exit(s2mu106_usbpd_exit
);
3211 MODULE_DESCRIPTION("s2mu106 USB PD driver");
3212 MODULE_LICENSE("GPL");