summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhang Bo <bo.zhang@nxp.com>2017-12-28 18:15:17 +0800
committerZhang Bo <bo.zhang@nxp.com>2017-12-28 18:40:15 +0800
commitad785b859ac6dcfcf73c25d0af93f88c655c8580 (patch)
tree5f42708efd05b6f161011ed8a91b161f17fad84c
parent6341a5e7e7816e5293100d2f25616b74b6ff93f1 (diff)
MA-10975[Android] Add USB device wakelock for imx8mq-evk boardo8.0.0_1.3.0_8m-prc
Add wakeup source in USB typec tcpm. So imx8mq-evk board will not enter suspend mode when connect with USB host. Change-Id: If3386ff8eece31fb464febd65c747259625b19ff Signed-off-by: Zhang Bo <bo.zhang@nxp.com>
-rw-r--r--drivers/staging/typec/tcpm.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/drivers/staging/typec/tcpm.c b/drivers/staging/typec/tcpm.c
index 723b80b230ee..cb02915f557a 100644
--- a/drivers/staging/typec/tcpm.c
+++ b/drivers/staging/typec/tcpm.c
@@ -27,6 +27,9 @@
#include <linux/spinlock.h>
#include <linux/usb/typec.h>
#include <linux/workqueue.h>
+#ifdef CONFIG_PM_WAKELOCKS
+#include <linux/wakelock.h>
+#endif
#include "pd.h"
#include "pd_vdo.h"
@@ -343,6 +346,10 @@ static enum tcpm_state tcpm_default_state(struct tcpm_port *port)
return SRC_UNATTACHED;
}
+#ifdef CONFIG_PM_WAKELOCKS
+static struct wake_lock wakelock;
+#endif
+
static inline
struct tcpm_port *typec_cap_to_tcpm(const struct typec_capability *cap)
{
@@ -2057,7 +2064,9 @@ static int tcpm_snk_attach(struct tcpm_port *port)
port->tcpc->ss_mux_sel(port->tcpc, polarity);
tcpm_start_drp_toggling(port);
-
+#ifdef CONFIG_PM_WAKELOCKS
+ wake_lock(&wakelock);
+#endif
ret = tcpm_set_roles(port, true, TYPEC_SINK, TYPEC_DEVICE);
if (ret < 0)
return ret;
@@ -2077,6 +2086,9 @@ static void tcpm_snk_detach(struct tcpm_port *port)
tcpm_detach(port);
/* XXX: (Dis)connect SuperSpeed mux? */
+#ifdef CONFIG_PM_WAKELOCKS
+ wake_unlock(&wakelock);
+#endif
}
static int tcpm_acc_attach(struct tcpm_port *port)
@@ -3567,6 +3579,10 @@ struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc)
tcpm_init(port);
mutex_unlock(&port->lock);
+#ifdef CONFIG_PM_WAKELOCKS
+ wake_lock_init(&wakelock, WAKE_LOCK_SUSPEND, "gadget");
+#endif
+
tcpm_log(port, "%s: registered", dev_name(dev));
return port;
@@ -3585,6 +3601,10 @@ void tcpm_unregister_port(struct tcpm_port *port)
typec_unregister_port(port->typec_port);
tcpm_debugfs_exit(port);
destroy_workqueue(port->wq);
+
+#ifdef CONFIG_PM_WAKELOCKS
+ wake_lock_destroy(&wakelock);
+#endif
}
EXPORT_SYMBOL_GPL(tcpm_unregister_port);