aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/dwc3
diff options
context:
space:
mode:
authorKishon Vijay Abraham I <kishon@ti.com>2013-01-24 22:00:49 -0500
committerFelipe Balbi <balbi@ti.com>2013-01-25 02:17:09 -0500
commit7e41bba94617b7e4f77d3531a63fbfacdf6842a6 (patch)
treec22c597e17fa0c4e109bb2787a8051079f6334ee /drivers/usb/dwc3
parent6373218da195e9baade9416727720646b3a622aa (diff)
usb: dwc3: omap: Add an API to write to dwc mailbox
Add an API in the omap glue layer to write to the mailbox register which can be used by comparator driver(twl). To pass the detection of the attached device (signified by VBUS, ID) to the dwc3 core, dwc3 core has to write to the mailbox regiter. Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb/dwc3')
-rw-r--r--drivers/usb/dwc3/dwc3-omap.c60
1 files changed, 60 insertions, 0 deletions
diff --git a/drivers/usb/dwc3/dwc3-omap.c b/drivers/usb/dwc3/dwc3-omap.c
index f85ae5e6129d..831b75fa4386 100644
--- a/drivers/usb/dwc3/dwc3-omap.c
+++ b/drivers/usb/dwc3/dwc3-omap.c
@@ -43,6 +43,7 @@
43#include <linux/spinlock.h> 43#include <linux/spinlock.h>
44#include <linux/platform_device.h> 44#include <linux/platform_device.h>
45#include <linux/platform_data/dwc3-omap.h> 45#include <linux/platform_data/dwc3-omap.h>
46#include <linux/usb/dwc3-omap.h>
46#include <linux/pm_runtime.h> 47#include <linux/pm_runtime.h>
47#include <linux/dma-mapping.h> 48#include <linux/dma-mapping.h>
48#include <linux/ioport.h> 49#include <linux/ioport.h>
@@ -131,6 +132,8 @@ struct dwc3_omap {
131 u32 dma_status:1; 132 u32 dma_status:1;
132}; 133};
133 134
135struct dwc3_omap *_omap;
136
134static inline u32 dwc3_omap_readl(void __iomem *base, u32 offset) 137static inline u32 dwc3_omap_readl(void __iomem *base, u32 offset)
135{ 138{
136 return readl(base + offset); 139 return readl(base + offset);
@@ -141,6 +144,57 @@ static inline void dwc3_omap_writel(void __iomem *base, u32 offset, u32 value)
141 writel(value, base + offset); 144 writel(value, base + offset);
142} 145}
143 146
147void dwc3_omap_mailbox(enum omap_dwc3_vbus_id_status status)
148{
149 u32 val;
150 struct dwc3_omap *omap = _omap;
151
152 switch (status) {
153 case OMAP_DWC3_ID_GROUND:
154 dev_dbg(omap->dev, "ID GND\n");
155
156 val = dwc3_omap_readl(omap->base, USBOTGSS_UTMI_OTG_STATUS);
157 val &= ~(USBOTGSS_UTMI_OTG_STATUS_IDDIG
158 | USBOTGSS_UTMI_OTG_STATUS_VBUSVALID
159 | USBOTGSS_UTMI_OTG_STATUS_SESSEND);
160 val |= USBOTGSS_UTMI_OTG_STATUS_SESSVALID
161 | USBOTGSS_UTMI_OTG_STATUS_POWERPRESENT;
162 dwc3_omap_writel(omap->base, USBOTGSS_UTMI_OTG_STATUS, val);
163 break;
164
165 case OMAP_DWC3_VBUS_VALID:
166 dev_dbg(omap->dev, "VBUS Connect\n");
167
168 val = dwc3_omap_readl(omap->base, USBOTGSS_UTMI_OTG_STATUS);
169 val &= ~USBOTGSS_UTMI_OTG_STATUS_SESSEND;
170 val |= USBOTGSS_UTMI_OTG_STATUS_IDDIG
171 | USBOTGSS_UTMI_OTG_STATUS_VBUSVALID
172 | USBOTGSS_UTMI_OTG_STATUS_SESSVALID
173 | USBOTGSS_UTMI_OTG_STATUS_POWERPRESENT;
174 dwc3_omap_writel(omap->base, USBOTGSS_UTMI_OTG_STATUS, val);
175 break;
176
177 case OMAP_DWC3_ID_FLOAT:
178 case OMAP_DWC3_VBUS_OFF:
179 dev_dbg(omap->dev, "VBUS Disconnect\n");
180
181 val = dwc3_omap_readl(omap->base, USBOTGSS_UTMI_OTG_STATUS);
182 val &= ~(USBOTGSS_UTMI_OTG_STATUS_SESSVALID
183 | USBOTGSS_UTMI_OTG_STATUS_VBUSVALID
184 | USBOTGSS_UTMI_OTG_STATUS_POWERPRESENT);
185 val |= USBOTGSS_UTMI_OTG_STATUS_SESSEND
186 | USBOTGSS_UTMI_OTG_STATUS_IDDIG;
187 dwc3_omap_writel(omap->base, USBOTGSS_UTMI_OTG_STATUS, val);
188 break;
189
190 default:
191 dev_dbg(omap->dev, "ID float\n");
192 }
193
194 return;
195}
196EXPORT_SYMBOL_GPL(dwc3_omap_mailbox);
197
144static int dwc3_omap_register_phys(struct dwc3_omap *omap) 198static int dwc3_omap_register_phys(struct dwc3_omap *omap)
145{ 199{
146 struct nop_usb_xceiv_platform_data pdata; 200 struct nop_usb_xceiv_platform_data pdata;
@@ -320,6 +374,12 @@ static int dwc3_omap_probe(struct platform_device *pdev)
320 omap->irq = irq; 374 omap->irq = irq;
321 omap->base = base; 375 omap->base = base;
322 376
377 /*
378 * REVISIT if we ever have two instances of the wrapper, we will be
379 * in big trouble
380 */
381 _omap = omap;
382
323 pm_runtime_enable(dev); 383 pm_runtime_enable(dev);
324 ret = pm_runtime_get_sync(dev); 384 ret = pm_runtime_get_sync(dev);
325 if (ret < 0) { 385 if (ret < 0) {