Loading drivers/usb/mtu3/mtu3.h +1 −0 Original line number Diff line number Diff line Loading @@ -347,6 +347,7 @@ struct ssusb_mtk { /* dp switch */ struct regmap *dp_switch; u32 dp_switch_oft; bool is_suspended; }; /** Loading drivers/usb/mtu3/mtu3_dr.c +11 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,8 @@ #define USB2_PORT 2 #define USB3_PORT 3 #define SSUSB_SUSPEND_RESUME_TIMEOUT (HZ) /* 1 sec */ static inline struct ssusb_mtk *otg_sx_to_ssusb(struct otg_switch_mtk *otg_sx) { return container_of(otg_sx, struct ssusb_mtk, otg_switch); Loading Loading @@ -215,6 +217,7 @@ static void ssusb_mode_sw_work_v2(struct work_struct *work) enum usb_role desired_role; enum usb_role current_role; unsigned long flags; size_t expire; desired_role = work_data->desired_role; current_role = otg_sx->current_role; Loading @@ -227,6 +230,14 @@ static void ssusb_mode_sw_work_v2(struct work_struct *work) mtu3_dbg_trace(ssusb->dev, "set role : %s", usb_role_string(desired_role)); expire = jiffies + SSUSB_SUSPEND_RESUME_TIMEOUT; while (time_before(jiffies, expire)) { if (!ssusb->is_suspended) break; dev_info(ssusb->dev, "wait for suspend/resume complete\n"); msleep(20); } pm_runtime_get_sync(ssusb->dev); /* switch port to off first */ Loading drivers/usb/mtu3/mtu3_plat.c +13 −6 Original line number Diff line number Diff line Loading @@ -978,15 +978,17 @@ static int mtu3_suspend_common(struct device *dev, pm_message_t msg) if (ssusb->clk_mgr && !ssusb->is_host) return 0; ssusb->is_suspended = true; ssusb->offload_mode = ssusb_offload_get_mode(); dev_info(ssusb->dev, "%s offload_mode %d\n", __func__, ssusb->offload_mode); if (ssusb->offload_mode == SSUSB_OFFLOAD_MODE_S) { ssusb_set_power_state(ssusb, MTU3_STATE_OFFLOAD); return 0; goto suspend; } else if (ssusb->offload_mode == SSUSB_OFFLOAD_MODE_D) { return 0; goto suspend; } ssusb_set_power_state(ssusb, MTU3_STATE_SUSPEND); Loading @@ -1010,7 +1012,8 @@ static int mtu3_suspend_common(struct device *dev, pm_message_t msg) ssusb_host_suspend(ssusb); break; default: return -EINVAL; ret = -EINVAL; goto err; } ret = wait_for_ip_sleep(ssusb); Loading @@ -1020,6 +1023,7 @@ static int mtu3_suspend_common(struct device *dev, pm_message_t msg) ssusb_phy_power_off(ssusb); clk_bulk_disable_unprepare(BULK_CLKS_CNT, ssusb->clks); ssusb_wakeup_set(ssusb, true); suspend: return 0; sleep_err: Loading @@ -1029,13 +1033,14 @@ static int mtu3_suspend_common(struct device *dev, pm_message_t msg) ssusb_set_mode(&ssusb->otg_switch, USB_ROLE_HOST); } err: ssusb->is_suspended = false; return ret; } static int mtu3_resume_common(struct device *dev, pm_message_t msg) { struct ssusb_mtk *ssusb = dev_get_drvdata(dev); int ret; int ret = 0; dev_info(ssusb->dev, "%s event %d\n", __func__, msg.event); Loading @@ -1048,9 +1053,9 @@ static int mtu3_resume_common(struct device *dev, pm_message_t msg) if (ssusb->offload_mode == SSUSB_OFFLOAD_MODE_S) { ssusb_set_power_state(ssusb, MTU3_STATE_POWER_ON); return 0; goto resume; } else if (ssusb->offload_mode == SSUSB_OFFLOAD_MODE_D) { return 0; goto resume; } ssusb_wakeup_set(ssusb, false); Loading @@ -1066,6 +1071,8 @@ static int mtu3_resume_common(struct device *dev, pm_message_t msg) ssusb_set_power_state(ssusb, MTU3_STATE_RESUME); resume: ssusb->is_suspended = false; return ret; phy_err: clk_bulk_disable_unprepare(BULK_CLKS_CNT, ssusb->clks); Loading Loading
drivers/usb/mtu3/mtu3.h +1 −0 Original line number Diff line number Diff line Loading @@ -347,6 +347,7 @@ struct ssusb_mtk { /* dp switch */ struct regmap *dp_switch; u32 dp_switch_oft; bool is_suspended; }; /** Loading
drivers/usb/mtu3/mtu3_dr.c +11 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,8 @@ #define USB2_PORT 2 #define USB3_PORT 3 #define SSUSB_SUSPEND_RESUME_TIMEOUT (HZ) /* 1 sec */ static inline struct ssusb_mtk *otg_sx_to_ssusb(struct otg_switch_mtk *otg_sx) { return container_of(otg_sx, struct ssusb_mtk, otg_switch); Loading Loading @@ -215,6 +217,7 @@ static void ssusb_mode_sw_work_v2(struct work_struct *work) enum usb_role desired_role; enum usb_role current_role; unsigned long flags; size_t expire; desired_role = work_data->desired_role; current_role = otg_sx->current_role; Loading @@ -227,6 +230,14 @@ static void ssusb_mode_sw_work_v2(struct work_struct *work) mtu3_dbg_trace(ssusb->dev, "set role : %s", usb_role_string(desired_role)); expire = jiffies + SSUSB_SUSPEND_RESUME_TIMEOUT; while (time_before(jiffies, expire)) { if (!ssusb->is_suspended) break; dev_info(ssusb->dev, "wait for suspend/resume complete\n"); msleep(20); } pm_runtime_get_sync(ssusb->dev); /* switch port to off first */ Loading
drivers/usb/mtu3/mtu3_plat.c +13 −6 Original line number Diff line number Diff line Loading @@ -978,15 +978,17 @@ static int mtu3_suspend_common(struct device *dev, pm_message_t msg) if (ssusb->clk_mgr && !ssusb->is_host) return 0; ssusb->is_suspended = true; ssusb->offload_mode = ssusb_offload_get_mode(); dev_info(ssusb->dev, "%s offload_mode %d\n", __func__, ssusb->offload_mode); if (ssusb->offload_mode == SSUSB_OFFLOAD_MODE_S) { ssusb_set_power_state(ssusb, MTU3_STATE_OFFLOAD); return 0; goto suspend; } else if (ssusb->offload_mode == SSUSB_OFFLOAD_MODE_D) { return 0; goto suspend; } ssusb_set_power_state(ssusb, MTU3_STATE_SUSPEND); Loading @@ -1010,7 +1012,8 @@ static int mtu3_suspend_common(struct device *dev, pm_message_t msg) ssusb_host_suspend(ssusb); break; default: return -EINVAL; ret = -EINVAL; goto err; } ret = wait_for_ip_sleep(ssusb); Loading @@ -1020,6 +1023,7 @@ static int mtu3_suspend_common(struct device *dev, pm_message_t msg) ssusb_phy_power_off(ssusb); clk_bulk_disable_unprepare(BULK_CLKS_CNT, ssusb->clks); ssusb_wakeup_set(ssusb, true); suspend: return 0; sleep_err: Loading @@ -1029,13 +1033,14 @@ static int mtu3_suspend_common(struct device *dev, pm_message_t msg) ssusb_set_mode(&ssusb->otg_switch, USB_ROLE_HOST); } err: ssusb->is_suspended = false; return ret; } static int mtu3_resume_common(struct device *dev, pm_message_t msg) { struct ssusb_mtk *ssusb = dev_get_drvdata(dev); int ret; int ret = 0; dev_info(ssusb->dev, "%s event %d\n", __func__, msg.event); Loading @@ -1048,9 +1053,9 @@ static int mtu3_resume_common(struct device *dev, pm_message_t msg) if (ssusb->offload_mode == SSUSB_OFFLOAD_MODE_S) { ssusb_set_power_state(ssusb, MTU3_STATE_POWER_ON); return 0; goto resume; } else if (ssusb->offload_mode == SSUSB_OFFLOAD_MODE_D) { return 0; goto resume; } ssusb_wakeup_set(ssusb, false); Loading @@ -1066,6 +1071,8 @@ static int mtu3_resume_common(struct device *dev, pm_message_t msg) ssusb_set_power_state(ssusb, MTU3_STATE_RESUME); resume: ssusb->is_suspended = false; return ret; phy_err: clk_bulk_disable_unprepare(BULK_CLKS_CNT, ssusb->clks); Loading