diff options
author | Bryan Wu <cooloney@kernel.org> | 2008-12-02 14:33:48 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-01-07 13:00:07 -0500 |
commit | c6cf8b003e5a37f8193c2883876c5942adcd7284 (patch) | |
tree | c0ce285fb7a70dfd149ecfc325ad4c468ea0bbbc /drivers/usb | |
parent | 6995eb68aab70e79eedb710d7d6d1f22d8aea4a7 (diff) |
USB: musb: add Blackfin specific configuration to MUSB
Some config registers are not avaiable in Blackfin, we have to comment them out.
v1-v2:
- remove Blackfin specific header file
- add Blackfin register version to musb_regs.h header file
Signed-off-by: Bryan Wu <cooloney@kernel.org>
Signed-off-by: Felipe Balbi <felipe.balbi@nokia.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb')
-rw-r--r-- | drivers/usb/musb/musb_core.c | 52 | ||||
-rw-r--r-- | drivers/usb/musb/musb_core.h | 70 | ||||
-rw-r--r-- | drivers/usb/musb/musb_host.c | 22 | ||||
-rw-r--r-- | drivers/usb/musb/musb_regs.h | 397 |
4 files changed, 397 insertions, 144 deletions
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c index 83720f61fdba..6c7faacfb535 100644 --- a/drivers/usb/musb/musb_core.c +++ b/drivers/usb/musb/musb_core.c | |||
@@ -148,7 +148,8 @@ static inline struct musb *dev_to_musb(struct device *dev) | |||
148 | 148 | ||
149 | /*-------------------------------------------------------------------------*/ | 149 | /*-------------------------------------------------------------------------*/ |
150 | 150 | ||
151 | #ifndef CONFIG_USB_TUSB6010 | 151 | #if !defined(CONFIG_USB_TUSB6010) && !defined(CONFIG_BLACKFIN) |
152 | |||
152 | /* | 153 | /* |
153 | * Load an endpoint's FIFO | 154 | * Load an endpoint's FIFO |
154 | */ | 155 | */ |
@@ -1124,25 +1125,25 @@ fifo_setup(struct musb *musb, struct musb_hw_ep *hw_ep, | |||
1124 | #endif | 1125 | #endif |
1125 | switch (cfg->style) { | 1126 | switch (cfg->style) { |
1126 | case FIFO_TX: | 1127 | case FIFO_TX: |
1127 | musb_writeb(mbase, MUSB_TXFIFOSZ, c_size); | 1128 | musb_write_txfifosz(mbase, c_size); |
1128 | musb_writew(mbase, MUSB_TXFIFOADD, c_off); | 1129 | musb_write_txfifoadd(mbase, c_off); |
1129 | hw_ep->tx_double_buffered = !!(c_size & MUSB_FIFOSZ_DPB); | 1130 | hw_ep->tx_double_buffered = !!(c_size & MUSB_FIFOSZ_DPB); |
1130 | hw_ep->max_packet_sz_tx = maxpacket; | 1131 | hw_ep->max_packet_sz_tx = maxpacket; |
1131 | break; | 1132 | break; |
1132 | case FIFO_RX: | 1133 | case FIFO_RX: |
1133 | musb_writeb(mbase, MUSB_RXFIFOSZ, c_size); | 1134 | musb_write_rxfifosz(mbase, c_size); |
1134 | musb_writew(mbase, MUSB_RXFIFOADD, c_off); | 1135 | musb_write_rxfifoadd(mbase, c_off); |
1135 | hw_ep->rx_double_buffered = !!(c_size & MUSB_FIFOSZ_DPB); | 1136 | hw_ep->rx_double_buffered = !!(c_size & MUSB_FIFOSZ_DPB); |
1136 | hw_ep->max_packet_sz_rx = maxpacket; | 1137 | hw_ep->max_packet_sz_rx = maxpacket; |
1137 | break; | 1138 | break; |
1138 | case FIFO_RXTX: | 1139 | case FIFO_RXTX: |
1139 | musb_writeb(mbase, MUSB_TXFIFOSZ, c_size); | 1140 | musb_write_txfifosz(mbase, c_size); |
1140 | musb_writew(mbase, MUSB_TXFIFOADD, c_off); | 1141 | musb_write_txfifoadd(mbase, c_off); |
1141 | hw_ep->rx_double_buffered = !!(c_size & MUSB_FIFOSZ_DPB); | 1142 | hw_ep->rx_double_buffered = !!(c_size & MUSB_FIFOSZ_DPB); |
1142 | hw_ep->max_packet_sz_rx = maxpacket; | 1143 | hw_ep->max_packet_sz_rx = maxpacket; |
1143 | 1144 | ||
1144 | musb_writeb(mbase, MUSB_RXFIFOSZ, c_size); | 1145 | musb_write_rxfifosz(mbase, c_size); |
1145 | musb_writew(mbase, MUSB_RXFIFOADD, c_off); | 1146 | musb_write_rxfifoadd(mbase, c_off); |
1146 | hw_ep->tx_double_buffered = hw_ep->rx_double_buffered; | 1147 | hw_ep->tx_double_buffered = hw_ep->rx_double_buffered; |
1147 | hw_ep->max_packet_sz_tx = maxpacket; | 1148 | hw_ep->max_packet_sz_tx = maxpacket; |
1148 | 1149 | ||
@@ -1246,9 +1247,10 @@ static int __init ep_config_from_table(struct musb *musb) | |||
1246 | */ | 1247 | */ |
1247 | static int __init ep_config_from_hw(struct musb *musb) | 1248 | static int __init ep_config_from_hw(struct musb *musb) |
1248 | { | 1249 | { |
1249 | u8 epnum = 0, reg; | 1250 | u8 epnum = 0; |
1250 | struct musb_hw_ep *hw_ep; | 1251 | struct musb_hw_ep *hw_ep; |
1251 | void *mbase = musb->mregs; | 1252 | void *mbase = musb->mregs; |
1253 | int ret = 0; | ||
1252 | 1254 | ||
1253 | DBG(2, "<== static silicon ep config\n"); | 1255 | DBG(2, "<== static silicon ep config\n"); |
1254 | 1256 | ||
@@ -1258,26 +1260,9 @@ static int __init ep_config_from_hw(struct musb *musb) | |||
1258 | musb_ep_select(mbase, epnum); | 1260 | musb_ep_select(mbase, epnum); |
1259 | hw_ep = musb->endpoints + epnum; | 1261 | hw_ep = musb->endpoints + epnum; |
1260 | 1262 | ||
1261 | /* read from core using indexed model */ | 1263 | ret = musb_read_fifosize(musb, hw_ep, epnum); |
1262 | reg = musb_readb(hw_ep->regs, 0x10 + MUSB_FIFOSIZE); | 1264 | if (ret < 0) |
1263 | if (!reg) { | ||
1264 | /* 0's returned when no more endpoints */ | ||
1265 | break; | 1265 | break; |
1266 | } | ||
1267 | musb->nr_endpoints++; | ||
1268 | musb->epmask |= (1 << epnum); | ||
1269 | |||
1270 | hw_ep->max_packet_sz_tx = 1 << (reg & 0x0f); | ||
1271 | |||
1272 | /* shared TX/RX FIFO? */ | ||
1273 | if ((reg & 0xf0) == 0xf0) { | ||
1274 | hw_ep->max_packet_sz_rx = hw_ep->max_packet_sz_tx; | ||
1275 | hw_ep->is_shared_fifo = true; | ||
1276 | continue; | ||
1277 | } else { | ||
1278 | hw_ep->max_packet_sz_rx = 1 << ((reg & 0xf0) >> 4); | ||
1279 | hw_ep->is_shared_fifo = false; | ||
1280 | } | ||
1281 | 1266 | ||
1282 | /* FIXME set up hw_ep->{rx,tx}_double_buffered */ | 1267 | /* FIXME set up hw_ep->{rx,tx}_double_buffered */ |
1283 | 1268 | ||
@@ -1326,7 +1311,7 @@ static int __init musb_core_init(u16 musb_type, struct musb *musb) | |||
1326 | 1311 | ||
1327 | /* log core options (read using indexed model) */ | 1312 | /* log core options (read using indexed model) */ |
1328 | musb_ep_select(mbase, 0); | 1313 | musb_ep_select(mbase, 0); |
1329 | reg = musb_readb(mbase, 0x10 + MUSB_CONFIGDATA); | 1314 | reg = musb_read_configdata(mbase); |
1330 | 1315 | ||
1331 | strcpy(aInfo, (reg & MUSB_CONFIGDATA_UTMIDW) ? "UTMI-16" : "UTMI-8"); | 1316 | strcpy(aInfo, (reg & MUSB_CONFIGDATA_UTMIDW) ? "UTMI-16" : "UTMI-8"); |
1332 | if (reg & MUSB_CONFIGDATA_DYNFIFO) | 1317 | if (reg & MUSB_CONFIGDATA_DYNFIFO) |
@@ -1391,7 +1376,7 @@ static int __init musb_core_init(u16 musb_type, struct musb *musb) | |||
1391 | } | 1376 | } |
1392 | 1377 | ||
1393 | /* log release info */ | 1378 | /* log release info */ |
1394 | hwvers = musb_readw(mbase, MUSB_HWVERS); | 1379 | hwvers = musb_read_hwvers(mbase); |
1395 | rev_major = (hwvers >> 10) & 0x1f; | 1380 | rev_major = (hwvers >> 10) & 0x1f; |
1396 | rev_minor = hwvers & 0x3ff; | 1381 | rev_minor = hwvers & 0x3ff; |
1397 | snprintf(aRevision, 32, "%d.%d%s", rev_major, | 1382 | snprintf(aRevision, 32, "%d.%d%s", rev_major, |
@@ -1400,8 +1385,7 @@ static int __init musb_core_init(u16 musb_type, struct musb *musb) | |||
1400 | musb_driver_name, type, aRevision, aDate); | 1385 | musb_driver_name, type, aRevision, aDate); |
1401 | 1386 | ||
1402 | /* configure ep0 */ | 1387 | /* configure ep0 */ |
1403 | musb->endpoints[0].max_packet_sz_tx = MUSB_EP0_FIFOSIZE; | 1388 | musb_configure_ep0(musb); |
1404 | musb->endpoints[0].max_packet_sz_rx = MUSB_EP0_FIFOSIZE; | ||
1405 | 1389 | ||
1406 | /* discover endpoint configuration */ | 1390 | /* discover endpoint configuration */ |
1407 | musb->nr_endpoints = 1; | 1391 | musb->nr_endpoints = 1; |
@@ -1445,7 +1429,7 @@ static int __init musb_core_init(u16 musb_type, struct musb *musb) | |||
1445 | 1429 | ||
1446 | hw_ep->regs = MUSB_EP_OFFSET(i, 0) + mbase; | 1430 | hw_ep->regs = MUSB_EP_OFFSET(i, 0) + mbase; |
1447 | #ifdef CONFIG_USB_MUSB_HDRC_HCD | 1431 | #ifdef CONFIG_USB_MUSB_HDRC_HCD |
1448 | hw_ep->target_regs = MUSB_BUSCTL_OFFSET(i, 0) + mbase; | 1432 | hw_ep->target_regs = musb_read_target_reg_base(i, mbase); |
1449 | hw_ep->rx_reinit = 1; | 1433 | hw_ep->rx_reinit = 1; |
1450 | hw_ep->tx_reinit = 1; | 1434 | hw_ep->tx_reinit = 1; |
1451 | #endif | 1435 | #endif |
diff --git a/drivers/usb/musb/musb_core.h b/drivers/usb/musb/musb_core.h index d45d258e63f0..630946a2d9fc 100644 --- a/drivers/usb/musb/musb_core.h +++ b/drivers/usb/musb/musb_core.h | |||
@@ -191,7 +191,7 @@ enum musb_g_ep0_state { | |||
191 | */ | 191 | */ |
192 | 192 | ||
193 | #if defined(CONFIG_ARCH_DAVINCI) || defined(CONFIG_ARCH_OMAP2430) \ | 193 | #if defined(CONFIG_ARCH_DAVINCI) || defined(CONFIG_ARCH_OMAP2430) \ |
194 | || defined(CONFIG_ARCH_OMAP3430) | 194 | || defined(CONFIG_ARCH_OMAP3430) || defined(CONFIG_BLACKFIN) |
195 | /* REVISIT indexed access seemed to | 195 | /* REVISIT indexed access seemed to |
196 | * misbehave (on DaVinci) for at least peripheral IN ... | 196 | * misbehave (on DaVinci) for at least peripheral IN ... |
197 | */ | 197 | */ |
@@ -448,6 +448,70 @@ static inline struct musb *gadget_to_musb(struct usb_gadget *g) | |||
448 | } | 448 | } |
449 | #endif | 449 | #endif |
450 | 450 | ||
451 | #ifdef CONFIG_BLACKFIN | ||
452 | static inline int musb_read_fifosize(struct musb *musb, | ||
453 | struct musb_hw_ep *hw_ep, u8 epnum) | ||
454 | { | ||
455 | musb->nr_endpoints++; | ||
456 | musb->epmask |= (1 << epnum); | ||
457 | |||
458 | if (epnum < 5) { | ||
459 | hw_ep->max_packet_sz_tx = 128; | ||
460 | hw_ep->max_packet_sz_rx = 128; | ||
461 | } else { | ||
462 | hw_ep->max_packet_sz_tx = 1024; | ||
463 | hw_ep->max_packet_sz_rx = 1024; | ||
464 | } | ||
465 | hw_ep->is_shared_fifo = false; | ||
466 | |||
467 | return 0; | ||
468 | } | ||
469 | |||
470 | static inline void musb_configure_ep0(struct musb *musb) | ||
471 | { | ||
472 | musb->endpoints[0].max_packet_sz_tx = MUSB_EP0_FIFOSIZE; | ||
473 | musb->endpoints[0].max_packet_sz_rx = MUSB_EP0_FIFOSIZE; | ||
474 | musb->endpoints[0].is_shared_fifo = true; | ||
475 | } | ||
476 | |||
477 | #else | ||
478 | |||
479 | static inline int musb_read_fifosize(struct musb *musb, | ||
480 | struct musb_hw_ep *hw_ep, u8 epnum) | ||
481 | { | ||
482 | u8 reg = 0; | ||
483 | |||
484 | /* read from core using indexed model */ | ||
485 | reg = musb_readb(hw_ep->regs, 0x10 + MUSB_FIFOSIZE); | ||
486 | /* 0's returned when no more endpoints */ | ||
487 | if (!reg) | ||
488 | return -ENODEV; | ||
489 | |||
490 | musb->nr_endpoints++; | ||
491 | musb->epmask |= (1 << epnum); | ||
492 | |||
493 | hw_ep->max_packet_sz_tx = 1 << (reg & 0x0f); | ||
494 | |||
495 | /* shared TX/RX FIFO? */ | ||
496 | if ((reg & 0xf0) == 0xf0) { | ||
497 | hw_ep->max_packet_sz_rx = hw_ep->max_packet_sz_tx; | ||
498 | hw_ep->is_shared_fifo = true; | ||
499 | return 0; | ||
500 | } else { | ||
501 | hw_ep->max_packet_sz_rx = 1 << ((reg & 0xf0) >> 4); | ||
502 | hw_ep->is_shared_fifo = false; | ||
503 | } | ||
504 | |||
505 | return 0; | ||
506 | } | ||
507 | |||
508 | static inline void musb_configure_ep0(struct musb *musb) | ||
509 | { | ||
510 | musb->endpoints[0].max_packet_sz_tx = MUSB_EP0_FIFOSIZE; | ||
511 | musb->endpoints[0].max_packet_sz_rx = MUSB_EP0_FIFOSIZE; | ||
512 | } | ||
513 | #endif /* CONFIG_BLACKFIN */ | ||
514 | |||
451 | 515 | ||
452 | /***************************** Glue it together *****************************/ | 516 | /***************************** Glue it together *****************************/ |
453 | 517 | ||
@@ -470,14 +534,14 @@ extern void musb_hnp_stop(struct musb *musb); | |||
470 | 534 | ||
471 | extern int musb_platform_set_mode(struct musb *musb, u8 musb_mode); | 535 | extern int musb_platform_set_mode(struct musb *musb, u8 musb_mode); |
472 | 536 | ||
473 | #if defined(CONFIG_USB_TUSB6010) || \ | 537 | #if defined(CONFIG_USB_TUSB6010) || defined(CONFIG_BLACKFIN) || \ |
474 | defined(CONFIG_ARCH_OMAP2430) || defined(CONFIG_ARCH_OMAP34XX) | 538 | defined(CONFIG_ARCH_OMAP2430) || defined(CONFIG_ARCH_OMAP34XX) |
475 | extern void musb_platform_try_idle(struct musb *musb, unsigned long timeout); | 539 | extern void musb_platform_try_idle(struct musb *musb, unsigned long timeout); |
476 | #else | 540 | #else |
477 | #define musb_platform_try_idle(x, y) do {} while (0) | 541 | #define musb_platform_try_idle(x, y) do {} while (0) |
478 | #endif | 542 | #endif |
479 | 543 | ||
480 | #ifdef CONFIG_USB_TUSB6010 | 544 | #if defined(CONFIG_USB_TUSB6010) || defined(CONFIG_BLACKFIN) |
481 | extern int musb_platform_get_vbus_status(struct musb *musb); | 545 | extern int musb_platform_get_vbus_status(struct musb *musb); |
482 | #else | 546 | #else |
483 | #define musb_platform_get_vbus_status(x) 0 | 547 | #define musb_platform_get_vbus_status(x) 0 |
diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c index bf25ef4cc151..99fa61234876 100644 --- a/drivers/usb/musb/musb_host.c +++ b/drivers/usb/musb/musb_host.c | |||
@@ -596,12 +596,10 @@ musb_rx_reinit(struct musb *musb, struct musb_qh *qh, struct musb_hw_ep *ep) | |||
596 | 596 | ||
597 | /* target addr and (for multipoint) hub addr/port */ | 597 | /* target addr and (for multipoint) hub addr/port */ |
598 | if (musb->is_multipoint) { | 598 | if (musb->is_multipoint) { |
599 | musb_writeb(ep->target_regs, MUSB_RXFUNCADDR, | 599 | musb_write_rxfunaddr(ep->target_regs, qh->addr_reg); |
600 | qh->addr_reg); | 600 | musb_write_rxhubaddr(ep->target_regs, qh->h_addr_reg); |
601 | musb_writeb(ep->target_regs, MUSB_RXHUBADDR, | 601 | musb_write_rxhubport(ep->target_regs, qh->h_port_reg); |
602 | qh->h_addr_reg); | 602 | |
603 | musb_writeb(ep->target_regs, MUSB_RXHUBPORT, | ||
604 | qh->h_port_reg); | ||
605 | } else | 603 | } else |
606 | musb_writeb(musb->mregs, MUSB_FADDR, qh->addr_reg); | 604 | musb_writeb(musb->mregs, MUSB_FADDR, qh->addr_reg); |
607 | 605 | ||
@@ -715,15 +713,9 @@ static void musb_ep_program(struct musb *musb, u8 epnum, | |||
715 | 713 | ||
716 | /* target addr and (for multipoint) hub addr/port */ | 714 | /* target addr and (for multipoint) hub addr/port */ |
717 | if (musb->is_multipoint) { | 715 | if (musb->is_multipoint) { |
718 | musb_writeb(mbase, | 716 | musb_write_txfunaddr(mbase, epnum, qh->addr_reg); |
719 | MUSB_BUSCTL_OFFSET(epnum, MUSB_TXFUNCADDR), | 717 | musb_write_txhubaddr(mbase, epnum, qh->h_addr_reg); |
720 | qh->addr_reg); | 718 | musb_write_txhubport(mbase, epnum, qh->h_port_reg); |
721 | musb_writeb(mbase, | ||
722 | MUSB_BUSCTL_OFFSET(epnum, MUSB_TXHUBADDR), | ||
723 | qh->h_addr_reg); | ||
724 | musb_writeb(mbase, | ||
725 | MUSB_BUSCTL_OFFSET(epnum, MUSB_TXHUBPORT), | ||
726 | qh->h_port_reg); | ||
727 | /* FIXME if !epnum, do the same for RX ... */ | 719 | /* FIXME if !epnum, do the same for RX ... */ |
728 | } else | 720 | } else |
729 | musb_writeb(mbase, MUSB_FADDR, qh->addr_reg); | 721 | musb_writeb(mbase, MUSB_FADDR, qh->addr_reg); |
diff --git a/drivers/usb/musb/musb_regs.h b/drivers/usb/musb/musb_regs.h index 9c228661aa5a..de3b2f18db44 100644 --- a/drivers/usb/musb/musb_regs.h +++ b/drivers/usb/musb/musb_regs.h | |||
@@ -38,97 +38,6 @@ | |||
38 | #define MUSB_EP0_FIFOSIZE 64 /* This is non-configurable */ | 38 | #define MUSB_EP0_FIFOSIZE 64 /* This is non-configurable */ |
39 | 39 | ||
40 | /* | 40 | /* |
41 | * Common USB registers | ||
42 | */ | ||
43 | |||
44 | #define MUSB_FADDR 0x00 /* 8-bit */ | ||
45 | #define MUSB_POWER 0x01 /* 8-bit */ | ||
46 | |||
47 | #define MUSB_INTRTX 0x02 /* 16-bit */ | ||
48 | #define MUSB_INTRRX 0x04 | ||
49 | #define MUSB_INTRTXE 0x06 | ||
50 | #define MUSB_INTRRXE 0x08 | ||
51 | #define MUSB_INTRUSB 0x0A /* 8 bit */ | ||
52 | #define MUSB_INTRUSBE 0x0B /* 8 bit */ | ||
53 | #define MUSB_FRAME 0x0C | ||
54 | #define MUSB_INDEX 0x0E /* 8 bit */ | ||
55 | #define MUSB_TESTMODE 0x0F /* 8 bit */ | ||
56 | |||
57 | /* Get offset for a given FIFO from musb->mregs */ | ||
58 | #ifdef CONFIG_USB_TUSB6010 | ||
59 | #define MUSB_FIFO_OFFSET(epnum) (0x200 + ((epnum) * 0x20)) | ||
60 | #else | ||
61 | #define MUSB_FIFO_OFFSET(epnum) (0x20 + ((epnum) * 4)) | ||
62 | #endif | ||
63 | |||
64 | /* | ||
65 | * Additional Control Registers | ||
66 | */ | ||
67 | |||
68 | #define MUSB_DEVCTL 0x60 /* 8 bit */ | ||
69 | |||
70 | /* These are always controlled through the INDEX register */ | ||
71 | #define MUSB_TXFIFOSZ 0x62 /* 8-bit (see masks) */ | ||
72 | #define MUSB_RXFIFOSZ 0x63 /* 8-bit (see masks) */ | ||
73 | #define MUSB_TXFIFOADD 0x64 /* 16-bit offset shifted right 3 */ | ||
74 | #define MUSB_RXFIFOADD 0x66 /* 16-bit offset shifted right 3 */ | ||
75 | |||
76 | /* REVISIT: vctrl/vstatus: optional vendor utmi+phy register at 0x68 */ | ||
77 | #define MUSB_HWVERS 0x6C /* 8 bit */ | ||
78 | |||
79 | #define MUSB_EPINFO 0x78 /* 8 bit */ | ||
80 | #define MUSB_RAMINFO 0x79 /* 8 bit */ | ||
81 | #define MUSB_LINKINFO 0x7a /* 8 bit */ | ||
82 | #define MUSB_VPLEN 0x7b /* 8 bit */ | ||
83 | #define MUSB_HS_EOF1 0x7c /* 8 bit */ | ||
84 | #define MUSB_FS_EOF1 0x7d /* 8 bit */ | ||
85 | #define MUSB_LS_EOF1 0x7e /* 8 bit */ | ||
86 | |||
87 | /* Offsets to endpoint registers */ | ||
88 | #define MUSB_TXMAXP 0x00 | ||
89 | #define MUSB_TXCSR 0x02 | ||
90 | #define MUSB_CSR0 MUSB_TXCSR /* Re-used for EP0 */ | ||
91 | #define MUSB_RXMAXP 0x04 | ||
92 | #define MUSB_RXCSR 0x06 | ||
93 | #define MUSB_RXCOUNT 0x08 | ||
94 | #define MUSB_COUNT0 MUSB_RXCOUNT /* Re-used for EP0 */ | ||
95 | #define MUSB_TXTYPE 0x0A | ||
96 | #define MUSB_TYPE0 MUSB_TXTYPE /* Re-used for EP0 */ | ||
97 | #define MUSB_TXINTERVAL 0x0B | ||
98 | #define MUSB_NAKLIMIT0 MUSB_TXINTERVAL /* Re-used for EP0 */ | ||
99 | #define MUSB_RXTYPE 0x0C | ||
100 | #define MUSB_RXINTERVAL 0x0D | ||
101 | #define MUSB_FIFOSIZE 0x0F | ||
102 | #define MUSB_CONFIGDATA MUSB_FIFOSIZE /* Re-used for EP0 */ | ||
103 | |||
104 | /* Offsets to endpoint registers in indexed model (using INDEX register) */ | ||
105 | #define MUSB_INDEXED_OFFSET(_epnum, _offset) \ | ||
106 | (0x10 + (_offset)) | ||
107 | |||
108 | /* Offsets to endpoint registers in flat models */ | ||
109 | #define MUSB_FLAT_OFFSET(_epnum, _offset) \ | ||
110 | (0x100 + (0x10*(_epnum)) + (_offset)) | ||
111 | |||
112 | #ifdef CONFIG_USB_TUSB6010 | ||
113 | /* TUSB6010 EP0 configuration register is special */ | ||
114 | #define MUSB_TUSB_OFFSET(_epnum, _offset) \ | ||
115 | (0x10 + _offset) | ||
116 | #include "tusb6010.h" /* Needed "only" for TUSB_EP0_CONF */ | ||
117 | #endif | ||
118 | |||
119 | /* "bus control"/target registers, for host side multipoint (external hubs) */ | ||
120 | #define MUSB_TXFUNCADDR 0x00 | ||
121 | #define MUSB_TXHUBADDR 0x02 | ||
122 | #define MUSB_TXHUBPORT 0x03 | ||
123 | |||
124 | #define MUSB_RXFUNCADDR 0x04 | ||
125 | #define MUSB_RXHUBADDR 0x06 | ||
126 | #define MUSB_RXHUBPORT 0x07 | ||
127 | |||
128 | #define MUSB_BUSCTL_OFFSET(_epnum, _offset) \ | ||
129 | (0x80 + (8*(_epnum)) + (_offset)) | ||
130 | |||
131 | /* | ||
132 | * MUSB Register bits | 41 | * MUSB Register bits |
133 | */ | 42 | */ |
134 | 43 | ||
@@ -228,7 +137,6 @@ | |||
228 | 137 | ||
229 | /* TXCSR in Peripheral and Host mode */ | 138 | /* TXCSR in Peripheral and Host mode */ |
230 | #define MUSB_TXCSR_AUTOSET 0x8000 | 139 | #define MUSB_TXCSR_AUTOSET 0x8000 |
231 | #define MUSB_TXCSR_MODE 0x2000 | ||
232 | #define MUSB_TXCSR_DMAENAB 0x1000 | 140 | #define MUSB_TXCSR_DMAENAB 0x1000 |
233 | #define MUSB_TXCSR_FRCDATATOG 0x0800 | 141 | #define MUSB_TXCSR_FRCDATATOG 0x0800 |
234 | #define MUSB_TXCSR_DMAMODE 0x0400 | 142 | #define MUSB_TXCSR_DMAMODE 0x0400 |
@@ -297,4 +205,309 @@ | |||
297 | /* HUBADDR */ | 205 | /* HUBADDR */ |
298 | #define MUSB_HUBADDR_MULTI_TT 0x80 | 206 | #define MUSB_HUBADDR_MULTI_TT 0x80 |
299 | 207 | ||
208 | |||
209 | #ifndef CONFIG_BLACKFIN | ||
210 | |||
211 | /* | ||
212 | * Common USB registers | ||
213 | */ | ||
214 | |||
215 | #define MUSB_FADDR 0x00 /* 8-bit */ | ||
216 | #define MUSB_POWER 0x01 /* 8-bit */ | ||
217 | |||
218 | #define MUSB_INTRTX 0x02 /* 16-bit */ | ||
219 | #define MUSB_INTRRX 0x04 | ||
220 | #define MUSB_INTRTXE 0x06 | ||
221 | #define MUSB_INTRRXE 0x08 | ||
222 | #define MUSB_INTRUSB 0x0A /* 8 bit */ | ||
223 | #define MUSB_INTRUSBE 0x0B /* 8 bit */ | ||
224 | #define MUSB_FRAME 0x0C | ||
225 | #define MUSB_INDEX 0x0E /* 8 bit */ | ||
226 | #define MUSB_TESTMODE 0x0F /* 8 bit */ | ||
227 | |||
228 | /* Get offset for a given FIFO from musb->mregs */ | ||
229 | #ifdef CONFIG_USB_TUSB6010 | ||
230 | #define MUSB_FIFO_OFFSET(epnum) (0x200 + ((epnum) * 0x20)) | ||
231 | #else | ||
232 | #define MUSB_FIFO_OFFSET(epnum) (0x20 + ((epnum) * 4)) | ||
233 | #endif | ||
234 | |||
235 | /* | ||
236 | * Additional Control Registers | ||
237 | */ | ||
238 | |||
239 | #define MUSB_DEVCTL 0x60 /* 8 bit */ | ||
240 | |||
241 | /* These are always controlled through the INDEX register */ | ||
242 | #define MUSB_TXFIFOSZ 0x62 /* 8-bit (see masks) */ | ||
243 | #define MUSB_RXFIFOSZ 0x63 /* 8-bit (see masks) */ | ||
244 | #define MUSB_TXFIFOADD 0x64 /* 16-bit offset shifted right 3 */ | ||
245 | #define MUSB_RXFIFOADD 0x66 /* 16-bit offset shifted right 3 */ | ||
246 | |||
247 | /* REVISIT: vctrl/vstatus: optional vendor utmi+phy register at 0x68 */ | ||
248 | #define MUSB_HWVERS 0x6C /* 8 bit */ | ||
249 | |||
250 | #define MUSB_EPINFO 0x78 /* 8 bit */ | ||
251 | #define MUSB_RAMINFO 0x79 /* 8 bit */ | ||
252 | #define MUSB_LINKINFO 0x7a /* 8 bit */ | ||
253 | #define MUSB_VPLEN 0x7b /* 8 bit */ | ||
254 | #define MUSB_HS_EOF1 0x7c /* 8 bit */ | ||
255 | #define MUSB_FS_EOF1 0x7d /* 8 bit */ | ||
256 | #define MUSB_LS_EOF1 0x7e /* 8 bit */ | ||
257 | |||
258 | /* Offsets to endpoint registers */ | ||
259 | #define MUSB_TXMAXP 0x00 | ||
260 | #define MUSB_TXCSR 0x02 | ||
261 | #define MUSB_CSR0 MUSB_TXCSR /* Re-used for EP0 */ | ||
262 | #define MUSB_RXMAXP 0x04 | ||
263 | #define MUSB_RXCSR 0x06 | ||
264 | #define MUSB_RXCOUNT 0x08 | ||
265 | #define MUSB_COUNT0 MUSB_RXCOUNT /* Re-used for EP0 */ | ||
266 | #define MUSB_TXTYPE 0x0A | ||
267 | #define MUSB_TYPE0 MUSB_TXTYPE /* Re-used for EP0 */ | ||
268 | #define MUSB_TXINTERVAL 0x0B | ||
269 | #define MUSB_NAKLIMIT0 MUSB_TXINTERVAL /* Re-used for EP0 */ | ||
270 | #define MUSB_RXTYPE 0x0C | ||
271 | #define MUSB_RXINTERVAL 0x0D | ||
272 | #define MUSB_FIFOSIZE 0x0F | ||
273 | #define MUSB_CONFIGDATA MUSB_FIFOSIZE /* Re-used for EP0 */ | ||
274 | |||
275 | /* Offsets to endpoint registers in indexed model (using INDEX register) */ | ||
276 | #define MUSB_INDEXED_OFFSET(_epnum, _offset) \ | ||
277 | (0x10 + (_offset)) | ||
278 | |||
279 | /* Offsets to endpoint registers in flat models */ | ||
280 | #define MUSB_FLAT_OFFSET(_epnum, _offset) \ | ||
281 | (0x100 + (0x10*(_epnum)) + (_offset)) | ||
282 | |||
283 | #ifdef CONFIG_USB_TUSB6010 | ||
284 | /* TUSB6010 EP0 configuration register is special */ | ||
285 | #define MUSB_TUSB_OFFSET(_epnum, _offset) \ | ||
286 | (0x10 + _offset) | ||
287 | #include "tusb6010.h" /* Needed "only" for TUSB_EP0_CONF */ | ||
288 | #endif | ||
289 | |||
290 | #define MUSB_TXCSR_MODE 0x2000 | ||
291 | |||
292 | /* "bus control"/target registers, for host side multipoint (external hubs) */ | ||
293 | #define MUSB_TXFUNCADDR 0x00 | ||
294 | #define MUSB_TXHUBADDR 0x02 | ||
295 | #define MUSB_TXHUBPORT 0x03 | ||
296 | |||
297 | #define MUSB_RXFUNCADDR 0x04 | ||
298 | #define MUSB_RXHUBADDR 0x06 | ||
299 | #define MUSB_RXHUBPORT 0x07 | ||
300 | |||
301 | #define MUSB_BUSCTL_OFFSET(_epnum, _offset) \ | ||
302 | (0x80 + (8*(_epnum)) + (_offset)) | ||
303 | |||
304 | static inline void musb_write_txfifosz(void __iomem *mbase, u8 c_size) | ||
305 | { | ||
306 | musb_writeb(mbase, MUSB_TXFIFOSZ, c_size); | ||
307 | } | ||
308 | |||
309 | static inline void musb_write_txfifoadd(void __iomem *mbase, u16 c_off) | ||
310 | { | ||
311 | musb_writew(mbase, MUSB_TXFIFOADD, c_off); | ||
312 | } | ||
313 | |||
314 | static inline void musb_write_rxfifosz(void __iomem *mbase, u8 c_size) | ||
315 | { | ||
316 | musb_writeb(mbase, MUSB_RXFIFOSZ, c_size); | ||
317 | } | ||
318 | |||
319 | static inline void musb_write_rxfifoadd(void __iomem *mbase, u16 c_off) | ||
320 | { | ||
321 | musb_writew(mbase, MUSB_RXFIFOADD, c_off); | ||
322 | } | ||
323 | |||
324 | static inline u8 musb_read_configdata(void __iomem *mbase) | ||
325 | { | ||
326 | return musb_readb(mbase, 0x10 + MUSB_CONFIGDATA); | ||
327 | } | ||
328 | |||
329 | static inline u16 musb_read_hwvers(void __iomem *mbase) | ||
330 | { | ||
331 | return musb_readw(mbase, MUSB_HWVERS); | ||
332 | } | ||
333 | |||
334 | static inline void __iomem *musb_read_target_reg_base(u8 i, void __iomem *mbase) | ||
335 | { | ||
336 | return (MUSB_BUSCTL_OFFSET(i, 0) + mbase); | ||
337 | } | ||
338 | |||
339 | static inline void musb_write_rxfunaddr(void __iomem *ep_target_regs, | ||
340 | u8 qh_addr_reg) | ||
341 | { | ||
342 | musb_writeb(ep_target_regs, MUSB_RXFUNCADDR, qh_addr_reg); | ||
343 | } | ||
344 | |||
345 | static inline void musb_write_rxhubaddr(void __iomem *ep_target_regs, | ||
346 | u8 qh_h_addr_reg) | ||
347 | { | ||
348 | musb_writeb(ep_target_regs, MUSB_RXHUBADDR, qh_h_addr_reg); | ||
349 | } | ||
350 | |||
351 | static inline void musb_write_rxhubport(void __iomem *ep_target_regs, | ||
352 | u8 qh_h_port_reg) | ||
353 | { | ||
354 | musb_writeb(ep_target_regs, MUSB_RXHUBPORT, qh_h_port_reg); | ||
355 | } | ||
356 | |||
357 | static inline void musb_write_txfunaddr(void __iomem *mbase, u8 epnum, | ||
358 | u8 qh_addr_reg) | ||
359 | { | ||
360 | musb_writeb(mbase, MUSB_BUSCTL_OFFSET(epnum, MUSB_TXFUNCADDR), | ||
361 | qh_addr_reg); | ||
362 | } | ||
363 | |||
364 | static inline void musb_write_txhubaddr(void __iomem *mbase, u8 epnum, | ||
365 | u8 qh_addr_reg) | ||
366 | { | ||
367 | musb_writeb(mbase, MUSB_BUSCTL_OFFSET(epnum, MUSB_TXHUBADDR), | ||
368 | qh_addr_reg); | ||
369 | } | ||
370 | |||
371 | static inline void musb_write_txhubport(void __iomem *mbase, u8 epnum, | ||
372 | u8 qh_h_port_reg) | ||
373 | { | ||
374 | musb_writeb(mbase, MUSB_BUSCTL_OFFSET(epnum, MUSB_TXHUBPORT), | ||
375 | qh_h_port_reg); | ||
376 | } | ||
377 | |||
378 | #else /* CONFIG_BLACKFIN */ | ||
379 | |||
380 | #define USB_BASE USB_FADDR | ||
381 | #define USB_OFFSET(reg) (reg - USB_BASE) | ||
382 | |||
383 | /* | ||
384 | * Common USB registers | ||
385 | */ | ||
386 | #define MUSB_FADDR USB_OFFSET(USB_FADDR) /* 8-bit */ | ||
387 | #define MUSB_POWER USB_OFFSET(USB_POWER) /* 8-bit */ | ||
388 | #define MUSB_INTRTX USB_OFFSET(USB_INTRTX) /* 16-bit */ | ||
389 | #define MUSB_INTRRX USB_OFFSET(USB_INTRRX) | ||
390 | #define MUSB_INTRTXE USB_OFFSET(USB_INTRTXE) | ||
391 | #define MUSB_INTRRXE USB_OFFSET(USB_INTRRXE) | ||
392 | #define MUSB_INTRUSB USB_OFFSET(USB_INTRUSB) /* 8 bit */ | ||
393 | #define MUSB_INTRUSBE USB_OFFSET(USB_INTRUSBE)/* 8 bit */ | ||
394 | #define MUSB_FRAME USB_OFFSET(USB_FRAME) | ||
395 | #define MUSB_INDEX USB_OFFSET(USB_INDEX) /* 8 bit */ | ||
396 | #define MUSB_TESTMODE USB_OFFSET(USB_TESTMODE)/* 8 bit */ | ||
397 | |||
398 | /* Get offset for a given FIFO from musb->mregs */ | ||
399 | #define MUSB_FIFO_OFFSET(epnum) \ | ||
400 | (USB_OFFSET(USB_EP0_FIFO) + ((epnum) * 8)) | ||
401 | |||
402 | /* | ||
403 | * Additional Control Registers | ||
404 | */ | ||
405 | |||
406 | #define MUSB_DEVCTL USB_OFFSET(USB_OTG_DEV_CTL) /* 8 bit */ | ||
407 | |||
408 | #define MUSB_LINKINFO USB_OFFSET(USB_LINKINFO)/* 8 bit */ | ||
409 | #define MUSB_VPLEN USB_OFFSET(USB_VPLEN) /* 8 bit */ | ||
410 | #define MUSB_HS_EOF1 USB_OFFSET(USB_HS_EOF1) /* 8 bit */ | ||
411 | #define MUSB_FS_EOF1 USB_OFFSET(USB_FS_EOF1) /* 8 bit */ | ||
412 | #define MUSB_LS_EOF1 USB_OFFSET(USB_LS_EOF1) /* 8 bit */ | ||
413 | |||
414 | /* Offsets to endpoint registers */ | ||
415 | #define MUSB_TXMAXP 0x00 | ||
416 | #define MUSB_TXCSR 0x04 | ||
417 | #define MUSB_CSR0 MUSB_TXCSR /* Re-used for EP0 */ | ||
418 | #define MUSB_RXMAXP 0x08 | ||
419 | #define MUSB_RXCSR 0x0C | ||
420 | #define MUSB_RXCOUNT 0x10 | ||
421 | #define MUSB_COUNT0 MUSB_RXCOUNT /* Re-used for EP0 */ | ||
422 | #define MUSB_TXTYPE 0x14 | ||
423 | #define MUSB_TYPE0 MUSB_TXTYPE /* Re-used for EP0 */ | ||
424 | #define MUSB_TXINTERVAL 0x18 | ||
425 | #define MUSB_NAKLIMIT0 MUSB_TXINTERVAL /* Re-used for EP0 */ | ||
426 | #define MUSB_RXTYPE 0x1C | ||
427 | #define MUSB_RXINTERVAL 0x20 | ||
428 | #define MUSB_TXCOUNT 0x28 | ||
429 | |||
430 | /* Offsets to endpoint registers in indexed model (using INDEX register) */ | ||
431 | #define MUSB_INDEXED_OFFSET(_epnum, _offset) \ | ||
432 | (0x40 + (_offset)) | ||
433 | |||
434 | /* Offsets to endpoint registers in flat models */ | ||
435 | #define MUSB_FLAT_OFFSET(_epnum, _offset) \ | ||
436 | (USB_OFFSET(USB_EP_NI0_TXMAXP) + (0x40 * (_epnum)) + (_offset)) | ||
437 | |||
438 | /* Not implemented - HW has seperate Tx/Rx FIFO */ | ||
439 | #define MUSB_TXCSR_MODE 0x0000 | ||
440 | |||
441 | /* | ||
442 | * Dummy stub for clk framework, it will be removed | ||
443 | * until Blackfin supports clk framework | ||
444 | */ | ||
445 | #define clk_get(dev, id) NULL | ||
446 | #define clk_put(clock) do {} while (0) | ||
447 | #define clk_enable(clock) do {} while (0) | ||
448 | #define clk_disable(clock) do {} while (0) | ||
449 | |||
450 | static inline void musb_write_txfifosz(void __iomem *mbase, u8 c_size) | ||
451 | { | ||
452 | } | ||
453 | |||
454 | static inline void musb_write_txfifoadd(void __iomem *mbase, u16 c_off) | ||
455 | { | ||
456 | } | ||
457 | |||
458 | static inline void musb_write_rxfifosz(void __iomem *mbase, u8 c_size) | ||
459 | { | ||
460 | } | ||
461 | |||
462 | static inline void musb_write_rxfifoadd(void __iomem *mbase, u16 c_off) | ||
463 | { | ||
464 | } | ||
465 | |||
466 | static inline u8 musb_read_configdata(void __iomem *mbase) | ||
467 | { | ||
468 | return 0; | ||
469 | } | ||
470 | |||
471 | static inline u16 musb_read_hwvers(void __iomem *mbase) | ||
472 | { | ||
473 | return 0; | ||
474 | } | ||
475 | |||
476 | static inline u16 musb_read_target_reg_base(u8 i, void __iomem *mbase) | ||
477 | { | ||
478 | return 0; | ||
479 | } | ||
480 | |||
481 | static inline void musb_write_rxfunaddr(void __iomem *ep_target_regs, | ||
482 | u8 qh_addr_req) | ||
483 | { | ||
484 | } | ||
485 | |||
486 | static inline void musb_write_rxhubaddr(void __iomem *ep_target_regs, | ||
487 | u8 qh_h_addr_reg) | ||
488 | { | ||
489 | } | ||
490 | |||
491 | static inline void musb_write_rxhubport(void __iomem *ep_target_regs, | ||
492 | u8 qh_h_port_reg) | ||
493 | { | ||
494 | } | ||
495 | |||
496 | static inline void musb_write_txfunaddr(void __iomem *mbase, u8 epnum, | ||
497 | u8 qh_addr_reg) | ||
498 | { | ||
499 | } | ||
500 | |||
501 | static inline void musb_write_txhubaddr(void __iomem *mbase, u8 epnum, | ||
502 | u8 qh_addr_reg) | ||
503 | { | ||
504 | } | ||
505 | |||
506 | static inline void musb_write_txhubport(void __iomem *mbase, u8 epnum, | ||
507 | u8 qh_h_port_reg) | ||
508 | { | ||
509 | } | ||
510 | |||
511 | #endif /* CONFIG_BLACKFIN */ | ||
512 | |||
300 | #endif /* __MUSB_REGS_H__ */ | 513 | #endif /* __MUSB_REGS_H__ */ |