summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRavi Babu <ravibabu@ti.com>2015-01-06 19:25:16 +0530
committerGerrit Code Review <gerrit2@git.omapzoom.org>2015-02-03 03:28:38 -0600
commitb2a6a3d144669701732568cde5cce17aa37c1ae1 (patch)
tree40aff904da990cc3261dd9db471babb6483b19dd
parent8c9f3bbbf9ffc294ca0e19a90963c295f55452d9 (diff)
usb: dwc3: debugfs: dual role switch through debugfs entries
dual role switch through debugfs entries usage: 1) mount debugfs # mount -t debugfs debugfs /mnt 2) To switch usb1 to device/host mode # echo "device" > /mnt/48890000.dwc3/mode # echo "host" > /mnt/48890000.dwc3/mode 3) To switch usb2 to device/host mode # echo "device" > /mnt/488d0000.dwc3/mode # echo "host" > /mnt/488d0000.dwc3/mode To switch to device mode: make sure previous mode is host. To switch to host mode: make sure previous mode is device Change-Id: Ie7f637df45b215b966e9eb17637907a74278aa7e Signed-off-by: Ravi Babu <ravibabu@ti.com>
-rw-r--r--drivers/usb/dwc3/debugfs.c11
-rw-r--r--drivers/usb/dwc3/dwc3-omap.c30
-rw-r--r--include/linux/usb/drd.h9
3 files changed, 42 insertions, 8 deletions
diff --git a/drivers/usb/dwc3/debugfs.c b/drivers/usb/dwc3/debugfs.c
index 9ac37fe1b6a..0cc5a015451 100644
--- a/drivers/usb/dwc3/debugfs.c
+++ b/drivers/usb/dwc3/debugfs.c
@@ -27,6 +27,7 @@
#include <linux/uaccess.h>
#include <linux/usb/ch9.h>
+#include <linux/usb/drd.h>
#include "core.h"
#include "gadget.h"
@@ -412,7 +413,15 @@ static ssize_t dwc3_mode_write(struct file *file,
if (mode) {
spin_lock_irqsave(&dwc->lock, flags);
- dwc3_set_mode(dwc, mode);
+ if (mode & DWC3_GCTL_PRTCAP_HOST) {
+ dwc3_omap_usbvbus_id_handler(dwc->dev->parent,
+ OMAP_DWC3_ID_GROUND);
+ mode = 0;
+ } else if (mode & DWC3_GCTL_PRTCAP_DEVICE) {
+ dwc3_omap_usbvbus_id_handler(dwc->dev->parent,
+ OMAP_DWC3_VBUS_VALID);
+ mode = 1;
+ }
spin_unlock_irqrestore(&dwc->lock, flags);
}
return count;
diff --git a/drivers/usb/dwc3/dwc3-omap.c b/drivers/usb/dwc3/dwc3-omap.c
index 4ccdef7333c..96b4c46cbbd 100644
--- a/drivers/usb/dwc3/dwc3-omap.c
+++ b/drivers/usb/dwc3/dwc3-omap.c
@@ -32,6 +32,7 @@
#include <linux/regulator/consumer.h>
#include <linux/usb/otg.h>
+#include <linux/usb/drd.h>
/*
* All these registers belong to OMAP's Wrapper around the
@@ -137,13 +138,6 @@ struct dwc3_omap {
struct regulator *vbus_reg;
};
-enum omap_dwc3_vbus_id_status {
- OMAP_DWC3_ID_FLOAT,
- OMAP_DWC3_ID_GROUND,
- OMAP_DWC3_VBUS_OFF,
- OMAP_DWC3_VBUS_VALID,
-};
-
static inline u32 dwc3_omap_readl(void __iomem *base, u32 offset)
{
return readl(base + offset);
@@ -278,6 +272,28 @@ static void dwc3_omap_set_mailbox(struct dwc3_omap *omap,
}
}
+int dwc3_omap_usbvbus_id_handler(struct device *dev,
+ enum omap_dwc3_vbus_id_status status)
+{
+ struct dwc3_omap *omap;
+ struct platform_device *pdev;
+
+ if (!dev)
+ return -ENODEV;
+
+ dev_dbg(omap->dev, "VBUS Connect\n");
+
+ pdev = to_platform_device(dev);
+ omap = platform_get_drvdata(pdev);
+ if (!omap)
+ return -ENODEV;
+
+ dwc3_omap_set_mailbox(omap, status);
+
+ return 0;
+}
+EXPORT_SYMBOL(dwc3_omap_usbvbus_id_handler);
+
static irqreturn_t dwc3_omap_interrupt(int irq, void *_omap)
{
struct dwc3_omap *omap = _omap;
diff --git a/include/linux/usb/drd.h b/include/linux/usb/drd.h
index 71c64dcd93e..6a9c3ce5635 100644
--- a/include/linux/usb/drd.h
+++ b/include/linux/usb/drd.h
@@ -22,6 +22,13 @@ struct usb_drd_gadget {
struct usb_drd_setup *gadget_setup;
};
+enum omap_dwc3_vbus_id_status {
+ OMAP_DWC3_ID_FLOAT,
+ OMAP_DWC3_ID_GROUND,
+ OMAP_DWC3_VBUS_OFF,
+ OMAP_DWC3_VBUS_VALID,
+};
+
#define DRD_UNREGISTERED 0x0
#define DRD_DEVICE_REGISTERED 0x1
#define DRD_HOST_REGISTERED 0x2
@@ -45,6 +52,8 @@ int usb_drd_stop_hcd(struct device *parent);
int usb_drd_start_udc(struct device *parent);
int usb_drd_stop_udc(struct device *parent);
int usb_drd_get_state(struct device *parent);
+int dwc3_omap_usbvbus_id_handler(struct device *dev,
+ enum omap_dwc3_vbus_id_status status);
#else
static inline int usb_drd_release(struct device *parent)
{ return 0; }