From 9f2fb933546847134de5d1b101d1244489cb0c26 Mon Sep 17 00:00:00 2001 From: Frank Wang Date: Thu, 7 Mar 2019 14:40:40 +0800 Subject: [PATCH] phy: rockchip-inno-usb2: add wake_lock function Prevent the system from entering suspend when usb cable is connecetd. Change-Id: I50c4a09d9142ebeb2d4e2a0ab2df59f98ef99737 Signed-off-by: Frank Wang --- drivers/phy/rockchip/phy-rockchip-inno-usb2.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c index e74f478c09d4..39144062ea6b 100644 --- a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c +++ b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c @@ -36,6 +36,7 @@ #include #include #include +#include #define BIT_WRITEABLE_SHIFT 16 #define SCHEDULE_DELAY (60 * HZ) @@ -255,6 +256,7 @@ struct rockchip_usb2phy_port { struct regulator *vbus; const struct rockchip_usb2phy_port_cfg *port_cfg; struct notifier_block event_nb; + struct wake_lock wakelock; enum usb_otg_state state; enum usb_dr_mode mode; }; @@ -1022,6 +1024,7 @@ static void rockchip_usb2phy_otg_sm_work(struct work_struct *work) switch (rphy->chg_type) { case POWER_SUPPLY_TYPE_USB: dev_dbg(&rport->phy->dev, "sdp cable is connected\n"); + wake_lock(&rport->wakelock); cable = EXTCON_CHG_USB_SDP; mutex_unlock(&rport->mutex); rockchip_usb2phy_power_on(rport->phy); @@ -1037,6 +1040,7 @@ static void rockchip_usb2phy_otg_sm_work(struct work_struct *work) break; case POWER_SUPPLY_TYPE_USB_CDP: dev_dbg(&rport->phy->dev, "cdp cable is connected\n"); + wake_lock(&rport->wakelock); cable = EXTCON_CHG_USB_CDP; mutex_unlock(&rport->mutex); rockchip_usb2phy_power_on(rport->phy); @@ -1072,6 +1076,7 @@ static void rockchip_usb2phy_otg_sm_work(struct work_struct *work) rphy->chg_type = POWER_SUPPLY_TYPE_UNKNOWN; rport->perip_connected = false; sch_work = false; + wake_unlock(&rport->wakelock); } else if (!rport->vbus_attached) { dev_dbg(&rport->phy->dev, "usb disconnect\n"); rport->state = OTG_STATE_B_IDLE; @@ -1079,6 +1084,7 @@ static void rockchip_usb2phy_otg_sm_work(struct work_struct *work) rphy->chg_state = USB_CHG_STATE_UNDEFINED; rphy->chg_type = POWER_SUPPLY_TYPE_UNKNOWN; delay = OTG_SCHEDULE_DELAY; + wake_unlock(&rport->wakelock); } break; case OTG_STATE_A_HOST: @@ -1614,6 +1620,7 @@ static int rockchip_usb2phy_otg_port_init(struct rockchip_usb2phy *rphy, if (rport->vbus_always_on) goto out; + wake_lock_init(&rport->wakelock, WAKE_LOCK_SUSPEND, "rockchip_otg"); INIT_DELAYED_WORK(&rport->bypass_uart_work, rockchip_usb_bypass_uart_work); INIT_DELAYED_WORK(&rport->chg_work, rockchip_chg_detect_work);