aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/dwc3/dwc3-omap.c
diff options
context:
space:
mode:
authorGeorge Cherian <george.cherian@ti.com>2013-06-12 05:23:47 -0400
committerFelipe Balbi <balbi@ti.com>2013-06-12 16:57:13 -0400
commitb1fd6cb5ee2f97a553d1c4b8a88914bd970daf37 (patch)
tree1914628bc04ac0b30eaca3a3097330a8b99366dd /drivers/usb/dwc3/dwc3-omap.c
parentff7307b534258c8864c356d15c52a84d0a5fbb35 (diff)
usb: dwc3: omap: Adds dwc3_omap_readl/writel wrappers
This patch adds wrappers to dwc3_omap_readl/writel calls to accomodate both OMAP5 and AM437x reg maps (It uses the cached register offsets). Also renames OMAP5 IRQ1 as IRQMISC and IRQ1 bits as IRQMISC bits. Signed-off-by: George Cherian <george.cherian@ti.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb/dwc3/dwc3-omap.c')
-rw-r--r--drivers/usb/dwc3/dwc3-omap.c173
1 files changed, 116 insertions, 57 deletions
diff --git a/drivers/usb/dwc3/dwc3-omap.c b/drivers/usb/dwc3/dwc3-omap.c
index 54dd6fe886e2..077f110bd746 100644
--- a/drivers/usb/dwc3/dwc3-omap.c
+++ b/drivers/usb/dwc3/dwc3-omap.c
@@ -67,10 +67,18 @@
67#define USBOTGSS_IRQENABLE_SET_0 0x002c 67#define USBOTGSS_IRQENABLE_SET_0 0x002c
68#define USBOTGSS_IRQENABLE_CLR_0 0x0030 68#define USBOTGSS_IRQENABLE_CLR_0 0x0030
69#define USBOTGSS_IRQ0_OFFSET 0x0004 69#define USBOTGSS_IRQ0_OFFSET 0x0004
70#define USBOTGSS_IRQSTATUS_RAW_1 0x0034 70#define USBOTGSS_IRQSTATUS_RAW_1 0x0030
71#define USBOTGSS_IRQSTATUS_1 0x0038 71#define USBOTGSS_IRQSTATUS_1 0x0034
72#define USBOTGSS_IRQENABLE_SET_1 0x003c 72#define USBOTGSS_IRQENABLE_SET_1 0x0038
73#define USBOTGSS_IRQENABLE_CLR_1 0x0040 73#define USBOTGSS_IRQENABLE_CLR_1 0x003c
74#define USBOTGSS_IRQSTATUS_RAW_2 0x0040
75#define USBOTGSS_IRQSTATUS_2 0x0044
76#define USBOTGSS_IRQENABLE_SET_2 0x0048
77#define USBOTGSS_IRQENABLE_CLR_2 0x004c
78#define USBOTGSS_IRQSTATUS_RAW_3 0x0050
79#define USBOTGSS_IRQSTATUS_3 0x0054
80#define USBOTGSS_IRQENABLE_SET_3 0x0058
81#define USBOTGSS_IRQENABLE_CLR_3 0x005c
74#define USBOTGSS_IRQSTATUS_EOI_MISC 0x0030 82#define USBOTGSS_IRQSTATUS_EOI_MISC 0x0030
75#define USBOTGSS_IRQSTATUS_RAW_MISC 0x0034 83#define USBOTGSS_IRQSTATUS_RAW_MISC 0x0034
76#define USBOTGSS_IRQSTATUS_MISC 0x0038 84#define USBOTGSS_IRQSTATUS_MISC 0x0038
@@ -102,17 +110,17 @@
102/* IRQS0 BITS */ 110/* IRQS0 BITS */
103#define USBOTGSS_IRQO_COREIRQ_ST (1 << 0) 111#define USBOTGSS_IRQO_COREIRQ_ST (1 << 0)
104 112
105/* IRQ1 BITS */ 113/* IRQMISC BITS */
106#define USBOTGSS_IRQ1_DMADISABLECLR (1 << 17) 114#define USBOTGSS_IRQMISC_DMADISABLECLR (1 << 17)
107#define USBOTGSS_IRQ1_OEVT (1 << 16) 115#define USBOTGSS_IRQMISC_OEVT (1 << 16)
108#define USBOTGSS_IRQ1_DRVVBUS_RISE (1 << 13) 116#define USBOTGSS_IRQMISC_DRVVBUS_RISE (1 << 13)
109#define USBOTGSS_IRQ1_CHRGVBUS_RISE (1 << 12) 117#define USBOTGSS_IRQMISC_CHRGVBUS_RISE (1 << 12)
110#define USBOTGSS_IRQ1_DISCHRGVBUS_RISE (1 << 11) 118#define USBOTGSS_IRQMISC_DISCHRGVBUS_RISE (1 << 11)
111#define USBOTGSS_IRQ1_IDPULLUP_RISE (1 << 8) 119#define USBOTGSS_IRQMISC_IDPULLUP_RISE (1 << 8)
112#define USBOTGSS_IRQ1_DRVVBUS_FALL (1 << 5) 120#define USBOTGSS_IRQMISC_DRVVBUS_FALL (1 << 5)
113#define USBOTGSS_IRQ1_CHRGVBUS_FALL (1 << 4) 121#define USBOTGSS_IRQMISC_CHRGVBUS_FALL (1 << 4)
114#define USBOTGSS_IRQ1_DISCHRGVBUS_FALL (1 << 3) 122#define USBOTGSS_IRQMISC_DISCHRGVBUS_FALL (1 << 3)
115#define USBOTGSS_IRQ1_IDPULLUP_FALL (1 << 0) 123#define USBOTGSS_IRQMISC_IDPULLUP_FALL (1 << 0)
116 124
117/* UTMI_OTG_CTRL REGISTER */ 125/* UTMI_OTG_CTRL REGISTER */
118#define USBOTGSS_UTMI_OTG_CTRL_DRVVBUS (1 << 5) 126#define USBOTGSS_UTMI_OTG_CTRL_DRVVBUS (1 << 5)
@@ -161,6 +169,58 @@ static inline void dwc3_omap_writel(void __iomem *base, u32 offset, u32 value)
161 writel(value, base + offset); 169 writel(value, base + offset);
162} 170}
163 171
172static u32 dwc3_omap_read_utmi_status(struct dwc3_omap *omap)
173{
174 return dwc3_omap_readl(omap->base, USBOTGSS_UTMI_OTG_STATUS +
175 omap->utmi_otg_offset);
176}
177
178static void dwc3_omap_write_utmi_status(struct dwc3_omap *omap, u32 value)
179{
180 dwc3_omap_writel(omap->base, USBOTGSS_UTMI_OTG_STATUS +
181 omap->utmi_otg_offset, value);
182
183}
184
185static u32 dwc3_omap_read_irq0_status(struct dwc3_omap *omap)
186{
187 return dwc3_omap_readl(omap->base, USBOTGSS_IRQSTATUS_0 -
188 omap->irq0_offset);
189}
190
191static void dwc3_omap_write_irq0_status(struct dwc3_omap *omap, u32 value)
192{
193 dwc3_omap_writel(omap->base, USBOTGSS_IRQSTATUS_0 -
194 omap->irq0_offset, value);
195
196}
197
198static u32 dwc3_omap_read_irqmisc_status(struct dwc3_omap *omap)
199{
200 return dwc3_omap_readl(omap->base, USBOTGSS_IRQSTATUS_MISC +
201 omap->irqmisc_offset);
202}
203
204static void dwc3_omap_write_irqmisc_status(struct dwc3_omap *omap, u32 value)
205{
206 dwc3_omap_writel(omap->base, USBOTGSS_IRQSTATUS_MISC +
207 omap->irqmisc_offset, value);
208
209}
210
211static void dwc3_omap_write_irqmisc_set(struct dwc3_omap *omap, u32 value)
212{
213 dwc3_omap_writel(omap->base, USBOTGSS_IRQENABLE_SET_MISC +
214 omap->irqmisc_offset, value);
215
216}
217
218static void dwc3_omap_write_irq0_set(struct dwc3_omap *omap, u32 value)
219{
220 dwc3_omap_writel(omap->base, USBOTGSS_IRQENABLE_SET_0 -
221 omap->irq0_offset, value);
222}
223
164int dwc3_omap_mailbox(enum omap_dwc3_vbus_id_status status) 224int dwc3_omap_mailbox(enum omap_dwc3_vbus_id_status status)
165{ 225{
166 u32 val; 226 u32 val;
@@ -173,38 +233,38 @@ int dwc3_omap_mailbox(enum omap_dwc3_vbus_id_status status)
173 case OMAP_DWC3_ID_GROUND: 233 case OMAP_DWC3_ID_GROUND:
174 dev_dbg(omap->dev, "ID GND\n"); 234 dev_dbg(omap->dev, "ID GND\n");
175 235
176 val = dwc3_omap_readl(omap->base, USBOTGSS_UTMI_OTG_STATUS); 236 val = dwc3_omap_read_utmi_status(omap);
177 val &= ~(USBOTGSS_UTMI_OTG_STATUS_IDDIG 237 val &= ~(USBOTGSS_UTMI_OTG_STATUS_IDDIG
178 | USBOTGSS_UTMI_OTG_STATUS_VBUSVALID 238 | USBOTGSS_UTMI_OTG_STATUS_VBUSVALID
179 | USBOTGSS_UTMI_OTG_STATUS_SESSEND); 239 | USBOTGSS_UTMI_OTG_STATUS_SESSEND);
180 val |= USBOTGSS_UTMI_OTG_STATUS_SESSVALID 240 val |= USBOTGSS_UTMI_OTG_STATUS_SESSVALID
181 | USBOTGSS_UTMI_OTG_STATUS_POWERPRESENT; 241 | USBOTGSS_UTMI_OTG_STATUS_POWERPRESENT;
182 dwc3_omap_writel(omap->base, USBOTGSS_UTMI_OTG_STATUS, val); 242 dwc3_omap_write_utmi_status(omap, val);
183 break; 243 break;
184 244
185 case OMAP_DWC3_VBUS_VALID: 245 case OMAP_DWC3_VBUS_VALID:
186 dev_dbg(omap->dev, "VBUS Connect\n"); 246 dev_dbg(omap->dev, "VBUS Connect\n");
187 247
188 val = dwc3_omap_readl(omap->base, USBOTGSS_UTMI_OTG_STATUS); 248 val = dwc3_omap_read_utmi_status(omap);
189 val &= ~USBOTGSS_UTMI_OTG_STATUS_SESSEND; 249 val &= ~USBOTGSS_UTMI_OTG_STATUS_SESSEND;
190 val |= USBOTGSS_UTMI_OTG_STATUS_IDDIG 250 val |= USBOTGSS_UTMI_OTG_STATUS_IDDIG
191 | USBOTGSS_UTMI_OTG_STATUS_VBUSVALID 251 | USBOTGSS_UTMI_OTG_STATUS_VBUSVALID
192 | USBOTGSS_UTMI_OTG_STATUS_SESSVALID 252 | USBOTGSS_UTMI_OTG_STATUS_SESSVALID
193 | USBOTGSS_UTMI_OTG_STATUS_POWERPRESENT; 253 | USBOTGSS_UTMI_OTG_STATUS_POWERPRESENT;
194 dwc3_omap_writel(omap->base, USBOTGSS_UTMI_OTG_STATUS, val); 254 dwc3_omap_write_utmi_status(omap, val);
195 break; 255 break;
196 256
197 case OMAP_DWC3_ID_FLOAT: 257 case OMAP_DWC3_ID_FLOAT:
198 case OMAP_DWC3_VBUS_OFF: 258 case OMAP_DWC3_VBUS_OFF:
199 dev_dbg(omap->dev, "VBUS Disconnect\n"); 259 dev_dbg(omap->dev, "VBUS Disconnect\n");
200 260
201 val = dwc3_omap_readl(omap->base, USBOTGSS_UTMI_OTG_STATUS); 261 val = dwc3_omap_read_utmi_status(omap);
202 val &= ~(USBOTGSS_UTMI_OTG_STATUS_SESSVALID 262 val &= ~(USBOTGSS_UTMI_OTG_STATUS_SESSVALID
203 | USBOTGSS_UTMI_OTG_STATUS_VBUSVALID 263 | USBOTGSS_UTMI_OTG_STATUS_VBUSVALID
204 | USBOTGSS_UTMI_OTG_STATUS_POWERPRESENT); 264 | USBOTGSS_UTMI_OTG_STATUS_POWERPRESENT);
205 val |= USBOTGSS_UTMI_OTG_STATUS_SESSEND 265 val |= USBOTGSS_UTMI_OTG_STATUS_SESSEND
206 | USBOTGSS_UTMI_OTG_STATUS_IDDIG; 266 | USBOTGSS_UTMI_OTG_STATUS_IDDIG;
207 dwc3_omap_writel(omap->base, USBOTGSS_UTMI_OTG_STATUS, val); 267 dwc3_omap_write_utmi_status(omap, val);
208 break; 268 break;
209 269
210 default: 270 default:
@@ -222,44 +282,45 @@ static irqreturn_t dwc3_omap_interrupt(int irq, void *_omap)
222 282
223 spin_lock(&omap->lock); 283 spin_lock(&omap->lock);
224 284
225 reg = dwc3_omap_readl(omap->base, USBOTGSS_IRQSTATUS_1); 285 reg = dwc3_omap_read_irqmisc_status(omap);
226 286
227 if (reg & USBOTGSS_IRQ1_DMADISABLECLR) { 287 if (reg & USBOTGSS_IRQMISC_DMADISABLECLR) {
228 dev_dbg(omap->dev, "DMA Disable was Cleared\n"); 288 dev_dbg(omap->dev, "DMA Disable was Cleared\n");
229 omap->dma_status = false; 289 omap->dma_status = false;
230 } 290 }
231 291
232 if (reg & USBOTGSS_IRQ1_OEVT) 292 if (reg & USBOTGSS_IRQMISC_OEVT)
233 dev_dbg(omap->dev, "OTG Event\n"); 293 dev_dbg(omap->dev, "OTG Event\n");
234 294
235 if (reg & USBOTGSS_IRQ1_DRVVBUS_RISE) 295 if (reg & USBOTGSS_IRQMISC_DRVVBUS_RISE)
236 dev_dbg(omap->dev, "DRVVBUS Rise\n"); 296 dev_dbg(omap->dev, "DRVVBUS Rise\n");
237 297
238 if (reg & USBOTGSS_IRQ1_CHRGVBUS_RISE) 298 if (reg & USBOTGSS_IRQMISC_CHRGVBUS_RISE)
239 dev_dbg(omap->dev, "CHRGVBUS Rise\n"); 299 dev_dbg(omap->dev, "CHRGVBUS Rise\n");
240 300
241 if (reg & USBOTGSS_IRQ1_DISCHRGVBUS_RISE) 301 if (reg & USBOTGSS_IRQMISC_DISCHRGVBUS_RISE)
242 dev_dbg(omap->dev, "DISCHRGVBUS Rise\n"); 302 dev_dbg(omap->dev, "DISCHRGVBUS Rise\n");
243 303
244 if (reg & USBOTGSS_IRQ1_IDPULLUP_RISE) 304 if (reg & USBOTGSS_IRQMISC_IDPULLUP_RISE)
245 dev_dbg(omap->dev, "IDPULLUP Rise\n"); 305 dev_dbg(omap->dev, "IDPULLUP Rise\n");
246 306
247 if (reg & USBOTGSS_IRQ1_DRVVBUS_FALL) 307 if (reg & USBOTGSS_IRQMISC_DRVVBUS_FALL)
248 dev_dbg(omap->dev, "DRVVBUS Fall\n"); 308 dev_dbg(omap->dev, "DRVVBUS Fall\n");
249 309
250 if (reg & USBOTGSS_IRQ1_CHRGVBUS_FALL) 310 if (reg & USBOTGSS_IRQMISC_CHRGVBUS_FALL)
251 dev_dbg(omap->dev, "CHRGVBUS Fall\n"); 311 dev_dbg(omap->dev, "CHRGVBUS Fall\n");
252 312
253 if (reg & USBOTGSS_IRQ1_DISCHRGVBUS_FALL) 313 if (reg & USBOTGSS_IRQMISC_DISCHRGVBUS_FALL)
254 dev_dbg(omap->dev, "DISCHRGVBUS Fall\n"); 314 dev_dbg(omap->dev, "DISCHRGVBUS Fall\n");
255 315
256 if (reg & USBOTGSS_IRQ1_IDPULLUP_FALL) 316 if (reg & USBOTGSS_IRQMISC_IDPULLUP_FALL)
257 dev_dbg(omap->dev, "IDPULLUP Fall\n"); 317 dev_dbg(omap->dev, "IDPULLUP Fall\n");
258 318
259 dwc3_omap_writel(omap->base, USBOTGSS_IRQSTATUS_1, reg); 319 dwc3_omap_write_irqmisc_status(omap, reg);
320
321 reg = dwc3_omap_read_irq0_status(omap);
260 322
261 reg = dwc3_omap_readl(omap->base, USBOTGSS_IRQSTATUS_0); 323 dwc3_omap_write_irq0_status(omap, reg);
262 dwc3_omap_writel(omap->base, USBOTGSS_IRQSTATUS_0, reg);
263 324
264 spin_unlock(&omap->lock); 325 spin_unlock(&omap->lock);
265 326
@@ -281,26 +342,26 @@ static void dwc3_omap_enable_irqs(struct dwc3_omap *omap)
281 342
282 /* enable all IRQs */ 343 /* enable all IRQs */
283 reg = USBOTGSS_IRQO_COREIRQ_ST; 344 reg = USBOTGSS_IRQO_COREIRQ_ST;
284 dwc3_omap_writel(omap->base, USBOTGSS_IRQENABLE_SET_0, reg); 345 dwc3_omap_write_irq0_set(omap, reg);
285 346
286 reg = (USBOTGSS_IRQ1_OEVT | 347 reg = (USBOTGSS_IRQMISC_OEVT |
287 USBOTGSS_IRQ1_DRVVBUS_RISE | 348 USBOTGSS_IRQMISC_DRVVBUS_RISE |
288 USBOTGSS_IRQ1_CHRGVBUS_RISE | 349 USBOTGSS_IRQMISC_CHRGVBUS_RISE |
289 USBOTGSS_IRQ1_DISCHRGVBUS_RISE | 350 USBOTGSS_IRQMISC_DISCHRGVBUS_RISE |
290 USBOTGSS_IRQ1_IDPULLUP_RISE | 351 USBOTGSS_IRQMISC_IDPULLUP_RISE |
291 USBOTGSS_IRQ1_DRVVBUS_FALL | 352 USBOTGSS_IRQMISC_DRVVBUS_FALL |
292 USBOTGSS_IRQ1_CHRGVBUS_FALL | 353 USBOTGSS_IRQMISC_CHRGVBUS_FALL |
293 USBOTGSS_IRQ1_DISCHRGVBUS_FALL | 354 USBOTGSS_IRQMISC_DISCHRGVBUS_FALL |
294 USBOTGSS_IRQ1_IDPULLUP_FALL); 355 USBOTGSS_IRQMISC_IDPULLUP_FALL);
295 356
296 dwc3_omap_writel(omap->base, USBOTGSS_IRQENABLE_SET_1, reg); 357 dwc3_omap_write_irqmisc_set(omap, reg);
297} 358}
298 359
299static void dwc3_omap_disable_irqs(struct dwc3_omap *omap) 360static void dwc3_omap_disable_irqs(struct dwc3_omap *omap)
300{ 361{
301 /* disable all IRQs */ 362 /* disable all IRQs */
302 dwc3_omap_writel(omap->base, USBOTGSS_IRQENABLE_SET_1, 0x00); 363 dwc3_omap_write_irqmisc_set(omap, 0x00);
303 dwc3_omap_writel(omap->base, USBOTGSS_IRQENABLE_SET_0, 0x00); 364 dwc3_omap_write_irq0_set(omap, 0x00);
304} 365}
305 366
306static u64 dwc3_omap_dma_mask = DMA_BIT_MASK(32); 367static u64 dwc3_omap_dma_mask = DMA_BIT_MASK(32);
@@ -378,7 +439,7 @@ static int dwc3_omap_probe(struct platform_device *pdev)
378 omap->revision = reg; 439 omap->revision = reg;
379 x_major = USBOTGSS_REVISION_XMAJOR(reg); 440 x_major = USBOTGSS_REVISION_XMAJOR(reg);
380 441
381 /* Differentiate between OMAP5,AM437x and others*/ 442 /* Differentiate between OMAP5 and AM437x */
382 switch (x_major) { 443 switch (x_major) {
383 case USBOTGSS_REVISION_XMAJOR1: 444 case USBOTGSS_REVISION_XMAJOR1:
384 case USBOTGSS_REVISION_XMAJOR2: 445 case USBOTGSS_REVISION_XMAJOR2:
@@ -410,7 +471,7 @@ static int dwc3_omap_probe(struct platform_device *pdev)
410 omap->debug_offset = USBOTGSS_DEBUG_OFFSET; 471 omap->debug_offset = USBOTGSS_DEBUG_OFFSET;
411 } 472 }
412 473
413 reg = dwc3_omap_readl(omap->base, USBOTGSS_UTMI_OTG_STATUS); 474 reg = dwc3_omap_read_utmi_status(omap);
414 475
415 of_property_read_u32(node, "utmi-mode", &utmi_mode); 476 of_property_read_u32(node, "utmi-mode", &utmi_mode);
416 477
@@ -425,7 +486,7 @@ static int dwc3_omap_probe(struct platform_device *pdev)
425 dev_dbg(dev, "UNKNOWN utmi mode %d\n", utmi_mode); 486 dev_dbg(dev, "UNKNOWN utmi mode %d\n", utmi_mode);
426 } 487 }
427 488
428 dwc3_omap_writel(omap->base, USBOTGSS_UTMI_OTG_STATUS, reg); 489 dwc3_omap_write_utmi_status(omap, reg);
429 490
430 /* check the DMA Status */ 491 /* check the DMA Status */
431 reg = dwc3_omap_readl(omap->base, USBOTGSS_SYSCONFIG); 492 reg = dwc3_omap_readl(omap->base, USBOTGSS_SYSCONFIG);
@@ -505,8 +566,7 @@ static int dwc3_omap_suspend(struct device *dev)
505{ 566{
506 struct dwc3_omap *omap = dev_get_drvdata(dev); 567 struct dwc3_omap *omap = dev_get_drvdata(dev);
507 568
508 omap->utmi_otg_status = dwc3_omap_readl(omap->base, 569 omap->utmi_otg_status = dwc3_omap_read_utmi_status(omap);
509 USBOTGSS_UTMI_OTG_STATUS);
510 570
511 return 0; 571 return 0;
512} 572}
@@ -515,8 +575,7 @@ static int dwc3_omap_resume(struct device *dev)
515{ 575{
516 struct dwc3_omap *omap = dev_get_drvdata(dev); 576 struct dwc3_omap *omap = dev_get_drvdata(dev);
517 577
518 dwc3_omap_writel(omap->base, USBOTGSS_UTMI_OTG_STATUS, 578 dwc3_omap_write_utmi_status(omap, omap->utmi_otg_status);
519 omap->utmi_otg_status);
520 579
521 pm_runtime_disable(dev); 580 pm_runtime_disable(dev);
522 pm_runtime_set_active(dev); 581 pm_runtime_set_active(dev);