summaryrefslogtreecommitdiff
path: root/drivers/usb/mtu3/mtu3_core.c
diff options
context:
space:
mode:
authorChunfeng Yun <chunfeng.yun@mediatek.com>2021-07-15 17:07:58 +0800
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2021-07-27 15:58:37 +0200
commit6b587394c65c23d5ba05a33e5899e2ed8dab3c97 (patch)
tree675abaf38feeb6f7798d562d403f8e1380b0923b /drivers/usb/mtu3/mtu3_core.c
parent427c66422e14b8468ee005aa6edf76ef0c2a8fc2 (diff)
usb: mtu3: support suspend/resume for dual-role mode
Support suspend/resume for dual-role mode including the single port and multi-ports supported by host controller, when the host supports mult-ports, only port0 (u2/u3) is used to support dual role mode. Signed-off-by: Chunfeng Yun <chunfeng.yun@mediatek.com> Link: https://lore.kernel.org/r/1626340078-29111-14-git-send-email-chunfeng.yun@mediatek.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/usb/mtu3/mtu3_core.c')
-rw-r--r--drivers/usb/mtu3/mtu3_core.c32
1 files changed, 17 insertions, 15 deletions
diff --git a/drivers/usb/mtu3/mtu3_core.c b/drivers/usb/mtu3/mtu3_core.c
index a800920d38b9..f90e5cdec614 100644
--- a/drivers/usb/mtu3/mtu3_core.c
+++ b/drivers/usb/mtu3/mtu3_core.c
@@ -9,7 +9,6 @@
*/
#include <linux/dma-mapping.h>
-#include <linux/iopoll.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/of_address.h>
@@ -1008,12 +1007,25 @@ void ssusb_gadget_exit(struct ssusb_mtk *ssusb)
mtu3_hw_exit(mtu);
}
+bool ssusb_gadget_ip_sleep_check(struct ssusb_mtk *ssusb)
+{
+ struct mtu3 *mtu = ssusb->u3d;
+
+ /* host only, should wait for ip sleep */
+ if (!mtu)
+ return true;
+
+ /* device is started and pullup D+, ip can sleep */
+ if (mtu->is_active && mtu->softconnect)
+ return true;
+
+ /* ip can't sleep if not pullup D+ when support device mode */
+ return false;
+}
+
int ssusb_gadget_suspend(struct ssusb_mtk *ssusb, pm_message_t msg)
{
struct mtu3 *mtu = ssusb->u3d;
- void __iomem *ibase = mtu->ippc_base;
- u32 value;
- int ret = 0;
if (!mtu->gadget_driver)
return 0;
@@ -1024,17 +1036,7 @@ int ssusb_gadget_suspend(struct ssusb_mtk *ssusb, pm_message_t msg)
mtu3_dev_suspend(mtu);
synchronize_irq(mtu->irq);
- /* wait for ip to sleep */
- if (mtu->is_active && mtu->softconnect) {
- ret = readl_poll_timeout(ibase + U3D_SSUSB_IP_PW_STS1,
- value, (value & SSUSB_IP_SLEEP_STS), 100, 100000);
- if (ret) {
- dev_err(mtu->dev, "ip sleep failed!!!\n");
- ret = -EBUSY;
- }
- }
-
- return ret;
+ return 0;
}
int ssusb_gadget_resume(struct ssusb_mtk *ssusb, pm_message_t msg)