[9610] : ccic : fix usbpd manager prevent issue
authorJunhan Bae <junhan84.bae@samsung.com>
Mon, 3 Sep 2018 02:18:38 +0000 (11:18 +0900)
committerhskang <hs1218.kang@samsung.com>
Mon, 3 Sep 2018 04:08:18 +0000 (13:08 +0900)
Change-Id: Ibfd9a8edce42a827e0913566ef99fda358d8cddf
Signed-off-by: Junhan Bae <junhan84.bae@samsung.com>
drivers/ccic/usbpd-manager.c

index 68e6fc3969c4a36b4a4456553c77e36d4bdeea9c..9db290a8b6b3b42f5366d660d8158bae3b3ae74f 100644 (file)
@@ -211,18 +211,26 @@ static void usbpd_process_pd_pr_swap(struct usbpd_dev *udev)
 static void usbpd_process_pd_src_cap(struct usbpd_dev *udev)
 {
        struct usbpd_desc *desc = udev->desc;
-       const struct usbpd_ops *ops = desc->ops;
-       struct usbpd_info *pd_info = &desc->pd_info;
+       const struct usbpd_ops *ops = NULL;
+       struct usbpd_info *pd_info = NULL;
 #if defined(CONFIG_IFCONN_NOTIFIER)
        struct ifconn_notifier_template *template = &udev->ifconn_template;
 #endif
        int available_pdo_num = 0;
        usbpd_pdic_sink_state_t *sink_status = &udev->pd_noti.sink_status;
 
+       if (desc == NULL)
+               return;
+
+       ops = desc->ops;
+       pd_info = &desc->pd_info;
+
        pd_info->do_power_nego = 0;
 
-       if (ops->usbpd_process_pd_src_cap)
-               return ops->usbpd_process_pd_src_cap(udev);
+       if (ops != NULL) {
+               if (ops->usbpd_process_pd_src_cap)
+                       return ops->usbpd_process_pd_src_cap(udev);
+       }
 
 #if defined(CONFIG_IFCONN_NOTIFIER)
        template->event = IFCONN_NOTIFY_EVENT_PD_SINK;
@@ -311,12 +319,20 @@ void usbpd_dp_detach(struct usbpd_dev *udev)
 int usbpd_process_cc_attach(struct usbpd_dev *udev, usbpd_attach_mode_t attach_mode)
 {
        struct usbpd_desc *desc = udev->desc;
-       const struct usbpd_ops *ops = desc->ops;
-       struct usbpd_info *pd_info = &desc->pd_info;
+       const struct usbpd_ops *ops = NULL;
+       struct usbpd_info *pd_info = NULL;
        usbpd_pdic_sink_state_t *sink_status = &udev->pd_noti.sink_status;
 
-       if (ops->usbpd_process_cc_attach)
-               return ops->usbpd_process_cc_attach(udev, attach_mode);
+       if (desc == NULL)
+               return -EINVAL;
+
+       ops = desc->ops;
+       pd_info = &desc->pd_info;
+
+       if (ops != NULL) {
+               if (ops->usbpd_process_cc_attach)
+                       return ops->usbpd_process_cc_attach(udev, attach_mode);
+       }
 
        if (pd_info->attach_mode != attach_mode) {
                pd_info->attach_mode = attach_mode;
@@ -458,8 +474,10 @@ int usbpd_process_cc_attach(struct usbpd_dev *udev, usbpd_attach_mode_t attach_m
                                        IFCONN_NOTIFY_EVENT_DETACH, NULL);
                                pd_info->data_role = USB_STATUS_NOTIFY_DETACH;
 #if defined(CONFIG_DUAL_ROLE_USB_INTF)
-                               if (!pd_info->try_state_change)
-                                       ops->usbpd_set_rprd_mode(udev, TYPE_C_ATTACH_DRP);
+                               if (!pd_info->try_state_change && ops != NULL) {
+                                       if (ops->usbpd_set_rprd_mode)
+                                               ops->usbpd_set_rprd_mode(udev, TYPE_C_ATTACH_DRP);
+                               }
 #endif
                        }
 
@@ -601,8 +619,8 @@ static int usbpd_process_discover_modes(struct usbpd_dev *udev)
        const struct usbpd_ops *ops = NULL;
        struct usbpd_info *pd_info = NULL;
        /* TODO add error exception */
-       u8 port_capability = pd_info->data_obj[1].discover_mode_dp_capability.port_capability;
-       u8 receptacle_indication = pd_info->data_obj[1].discover_mode_dp_capability.receptacle_indication;
+       u8 port_capability = 0;
+       u8 receptacle_indication = 0;
 
        if (desc == NULL)
                return -EINVAL;
@@ -610,6 +628,12 @@ static int usbpd_process_discover_modes(struct usbpd_dev *udev)
        ops = desc->ops;
        pd_info = &desc->pd_info;
 
+       if (pd_info == NULL)
+               return -EINVAL;
+
+       port_capability = pd_info->data_obj[1].discover_mode_dp_capability.port_capability;
+       receptacle_indication = pd_info->data_obj[1].discover_mode_dp_capability.receptacle_indication;
+
        if (ops != NULL) {
                if (ops->usbpd_process_discover_modes)
                        return ops->usbpd_process_discover_modes(udev);
@@ -669,14 +693,18 @@ static int usbpd_process_discover_modes(struct usbpd_dev *udev)
                dev_info(&udev->dev, "pDP_DIS_MODE->DATA_MSG_VDM_HEADER.DATA = 0x%08X\n\r", pd_info->data_obj[0].object);
                dev_info(&udev->dev, "pDP_DIS_MODE->DATA_MSG_MODE_VDO_DP.DATA = 0x%08X\n\r", pd_info->data_obj[1].object);
 
-               if (ops->usbpd_pd_next_state)
-                       ops->usbpd_pd_next_state(udev);
+               if (ops != NULL) {
+                       if (ops->usbpd_pd_next_state)
+                               ops->usbpd_pd_next_state(udev);
+               }
        }
 
        dev_info(&udev->dev, "%s\n", __func__);
 
-       if (ops->usbpd_clear_discover_mode)
-               ops->usbpd_clear_discover_mode(udev);
+       if (ops != NULL) {
+               if (ops->usbpd_clear_discover_mode)
+                       ops->usbpd_clear_discover_mode(udev);
+       }
 
        return 0;
 }
@@ -782,12 +810,14 @@ static int usbpd_process_dp_status_update(struct usbpd_dev *udev)
 
                                dev_info(&udev->dev, "%s multi_func_preference %d  %s\n", __func__,
                                         multi_func_preference, DP_Pin_Assignment_Print[pin_info]);
-                               if (ops->usbpd_dp_pin_assignment) {
-                                       ret = ops->usbpd_dp_pin_assignment(udev, pin_assignment);
-                                       if (ret < 0) {
-                                               dev_err(&udev->dev, "%s has i2c write error.\n",
-                                                       __func__);
-                                               return ret;
+                               if (ops != NULL) {
+                                       if (ops->usbpd_dp_pin_assignment) {
+                                               ret = ops->usbpd_dp_pin_assignment(udev, pin_assignment);
+                                               if (ret < 0) {
+                                                       dev_err(&udev->dev, "%s has i2c write error.\n",
+                                                               __func__);
+                                                       return ret;
+                                               }
                                        }
                                }
                                pd_info->is_sent_pin_configuration = 1;
@@ -844,12 +874,14 @@ static int usbpd_process_dp_configure(struct usbpd_dev *udev)
                /* It will start discover mode with that svid */
                dev_info(&udev->dev, "%s : svid1 is dex station\n", __func__);
 
-               if (ops->usbpd_select_svid) {
-                       ret = ops->usbpd_select_svid(udev, 1);
-                       if (ret < 0) {
-                               dev_err(&udev->dev, "%s select svid error.\n",
-                                       __func__);
-                               return ret;
+               if (ops != NULL) {
+                       if (ops->usbpd_select_svid) {
+                               ret = ops->usbpd_select_svid(udev, 1);
+                               if (ret < 0) {
+                                       dev_err(&udev->dev, "%s select svid error.\n",
+                                               __func__);
+                                       return ret;
+                               }
                        }
                }
        }
@@ -925,12 +957,15 @@ static int usbpd_process_attention(struct usbpd_dev *udev)
 
                        dev_info(&udev->dev, "%s multi_func_preference %d  %s\n", __func__,
                                 multi_func_preference, DP_Pin_Assignment_Print[pin_info]);
-                       if (ops->usbpd_dp_pin_assignment) {
-                               ret = ops->usbpd_dp_pin_assignment(udev, pin_assignment);
-                               if (ret < 0) {
-                                       dev_err(&udev->dev, "%s has i2c write error.\n",
-                                               __func__);
-                                       return ret;
+
+                       if (ops != NULL) {
+                               if (ops->usbpd_dp_pin_assignment) {
+                                       ret = ops->usbpd_dp_pin_assignment(udev, pin_assignment);
+                                       if (ret < 0) {
+                                               dev_err(&udev->dev, "%s has i2c write error.\n",
+                                                       __func__);
+                                               return ret;
+                                       }
                                }
                        }
                        pd_info->is_sent_pin_configuration = 1;