[RAMEN9610-13030][9610] drivers : add ccic rp current level check fucntion
authorJunhan Bae <junhan84.bae@samsung.com>
Thu, 7 Mar 2019 12:52:55 +0000 (21:52 +0900)
committerhskang <hs1218.kang@samsung.com>
Sun, 10 Mar 2019 06:35:54 +0000 (15:35 +0900)
Change-Id: I6e300c7e3f8b1024370d2a424d2c6e6ced5dc348
Signed-off-by: Junhan Bae <junhan84.bae@samsung.com>
drivers/ccic/s2mu106-usbpd.c
include/linux/ccic/usbpd-s2mu106.h
include/linux/ifconn/ifconn_notifier.h

index 746407c145a85f6d6d97ea442e32a9219393f17c..2cf19c399627d86cbaea61b6f5433bb00847f129 100644 (file)
@@ -2101,6 +2101,35 @@ static void s2mu106_usbpd_prevent_watchdog_reset(
        mutex_unlock(&pdic_data->lpm_mutex);
 }
 
+static void s2mu106_usbpd_rp_current_check(struct s2mu106_usbpd_data *pdic_data)
+{
+       struct i2c_client *i2c = pdic_data->i2c;
+       struct device *dev = pdic_data->dev;
+       u8 val = 0;
+       u8 cc1_val = 0, cc2_val = 0;
+       u8 rp_currentlvl = 0;
+
+       s2mu106_usbpd_read_reg(i2c, S2MU106_REG_PLUG_FSM_MON, &val);
+
+       cc1_val = val & S2MU106_REG_CTRL_MON_CC1_MASK;
+       cc2_val = (val & S2MU106_REG_CTRL_MON_CC2_MASK) >> S2MU106_REG_CTRL_MON_CC2_SHIFT;
+
+       dev_info(dev, "%s, rp check : cc1_val(%x), cc2_val(%x)\n",
+                                       __func__, cc1_val, cc2_val);
+
+       if (cc1_val == USBPD_10k || cc2_val == USBPD_10k)
+               rp_currentlvl = RP_CURRENT_LEVEL3;
+       else if (cc1_val == USBPD_22k || cc2_val == USBPD_22k)
+               rp_currentlvl = RP_CURRENT_LEVEL2;
+       else if (cc1_val == USBPD_56k || cc2_val == USBPD_56k)
+               rp_currentlvl = RP_CURRENT_LEVEL_DEFAULT;
+
+       pd_noti.sink_status.rp_currentlvl = rp_currentlvl;
+       pd_noti.event = IFCONN_NOTIFY_EVENT_RP_ATTACH;
+       ifconn_event_work(pdic_data, IFCONN_NOTIFY_MANAGER,
+                       IFCONN_NOTIFY_ID_POWER_STATUS, IFCONN_NOTIFY_EVENT_ATTACH, &pd_noti);
+}
+
 static void s2mu106_usbpd_detach_init(struct s2mu106_usbpd_data *pdic_data)
 {
        struct device *dev = pdic_data->dev;
@@ -2336,6 +2365,7 @@ static int s2mu106_check_port_detect(struct s2mu106_usbpd_data *pdic_data)
                        }
                }
 #endif
+               s2mu106_usbpd_rp_current_check(pdic_data);
        } else if ((data & S2MU106_PR_MASK) == S2MU106_PDIC_SOURCE) {
                dev_info(dev, "SOURCE\n");
                ret = s2mu106_usbpd_check_accessory(pdic_data);
index e44c5cb92b923551101788a7decc88d40e107a2f..613bbe3f9f3feadb87d57ea3544142b627254515 100644 (file)
@@ -401,7 +401,7 @@ enum s2mu106_usbpd_reg {
     S2MU106_REG_ADC_STATUS         = 0xB2,
     S2MU106_REG_PLUG_MON1          = 0xB3,
     S2MU106_REG_PLUG_MON2          = 0xB4,
-    S2MU106_REG_PLUG_FSM_MON       = 0xB5,
+    S2MU106_REG_PLUG_FSM_MON       = 0xB7,
 
     S2MU106_REG_MSG_SEND_CON       = 0x90,
     S2MU106_REG_MSG_TX_HEADER_L    = 0x91,
index 43344013b7b31687ac7ac4d30b30122d86d8c102..c5ed3f3737d64b1e0cbd78d02c217d820f78079c 100644 (file)
@@ -111,6 +111,7 @@ typedef enum {
        IFCONN_NOTIFY_EVENT_MUIC_LOGICALLY_DETACH,
        IFCONN_NOTIFY_EVENT_MUIC_LOGICALLY_ATTACH,
        IFCONN_NOTIFY_EVENT_IN_HURRY,
+       IFCONN_NOTIFY_EVENT_RP_ATTACH,
 } ifconn_notifier_event_t;
 
 typedef enum {