diff options
author | Ravi Babu <ravibabu@ti.com> | 2015-01-06 19:25:16 +0530 |
---|---|---|
committer | Gerrit Code Review <gerrit2@git.omapzoom.org> | 2015-02-03 03:28:38 -0600 |
commit | b2a6a3d144669701732568cde5cce17aa37c1ae1 (patch) | |
tree | 40aff904da990cc3261dd9db471babb6483b19dd | |
parent | 8c9f3bbbf9ffc294ca0e19a90963c295f55452d9 (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.c | 11 | ||||
-rw-r--r-- | drivers/usb/dwc3/dwc3-omap.c | 30 | ||||
-rw-r--r-- | include/linux/usb/drd.h | 9 |
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; } |