usb: musb: Change end point selection to use new IO access
authorTony Lindgren <tony@atomide.com>
Mon, 24 Nov 2014 19:05:03 +0000 (11:05 -0800)
committerFelipe Balbi <balbi@ti.com>
Tue, 25 Nov 2014 14:47:06 +0000 (08:47 -0600)
This allows the endpoints to work when multiple MUSB glue
layers are built in.

Cc: Fabio Baltieri <fabio.baltieri@linaro.org>
Cc: Lee Jones <lee.jones@linaro.org>
Cc: Lars-Peter Clausen <lars@metafoo.de>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Acked-by: Apelete Seketeli <apelete@seketeli.net>
Signed-off-by: Tony Lindgren <tony@atomide.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/musb/am35x.c
drivers/usb/musb/da8xx.c
drivers/usb/musb/jz4740.c
drivers/usb/musb/musb_core.c
drivers/usb/musb/musb_core.h
drivers/usb/musb/musb_dsps.c
drivers/usb/musb/musb_io.h
drivers/usb/musb/musb_regs.h
drivers/usb/musb/musbhsdma.c
drivers/usb/musb/tusb6010.c
drivers/usb/musb/ux500.c

index 7fc8d47ce18e4da7792e3d7156d4ec8b4b3ecfd3..220fd4d3b41cf671dcfa825daa52be7a0477f6c9 100644 (file)
@@ -438,6 +438,7 @@ static void am35x_read_fifo(struct musb_hw_ep *hw_ep, u16 len, u8 *dst)
 }
 
 static const struct musb_platform_ops am35x_ops = {
+       .quirks         = MUSB_INDEXED_EP,
        .init           = am35x_musb_init,
        .exit           = am35x_musb_exit,
 
index 527c7fe60ece743575312e5ace6e50cfbb319efa..9a61713009310bcec5d2248fd5d027c28302ac20 100644 (file)
@@ -458,6 +458,7 @@ static int da8xx_musb_exit(struct musb *musb)
 }
 
 static const struct musb_platform_ops da8xx_ops = {
+       .quirks         = MUSB_INDEXED_EP,
        .init           = da8xx_musb_init,
        .exit           = da8xx_musb_exit,
 
index d1187290d4e3ede0430f1182df24e1f62750b2d6..40e98747d17faea64ee4f11d47eef908814ba707 100644 (file)
@@ -106,6 +106,7 @@ static int jz4740_musb_exit(struct musb *musb)
 }
 
 static const struct musb_platform_ops jz4740_musb_ops = {
+       .quirks         = MUSB_INDEXED_EP,
        .init           = jz4740_musb_init,
        .exit           = jz4740_musb_exit,
 };
index 1c1a9a12fdc7191e36e508d8ff72a204cb5982a1..1ff944a0735909ccac4a4ad959b5201b0a64acc1 100644 (file)
@@ -229,6 +229,27 @@ static u32 musb_default_fifo_offset(u8 epnum)
        return 0x20 + (epnum * 4);
 }
 
+/* "flat" mapping: each endpoint has its own i/o address */
+static void musb_flat_ep_select(void __iomem *mbase, u8 epnum)
+{
+}
+
+static u32 musb_flat_ep_offset(u8 epnum, u16 offset)
+{
+       return 0x100 + (0x10 * epnum) + offset;
+}
+
+/* "indexed" mapping: INDEX register controls register bank select */
+static void musb_indexed_ep_select(void __iomem *mbase, u8 epnum)
+{
+       musb_writeb(mbase, MUSB_INDEX, epnum);
+}
+
+static u32 musb_indexed_ep_offset(u8 epnum, u16 offset)
+{
+       return 0x10 + offset;
+}
+
 static u8 musb_default_readb(const void __iomem *addr, unsigned offset)
 {
        return __raw_readb(addr + offset);
@@ -1537,7 +1558,7 @@ static int musb_core_init(u16 musb_type, struct musb *musb)
                }
 #endif
 
-               hw_ep->regs = MUSB_EP_OFFSET(i, 0) + mbase;
+               hw_ep->regs = musb->io.ep_offset(i, 0) + mbase;
                hw_ep->target_regs = musb_read_target_reg_base(i, mbase);
                hw_ep->rx_reinit = 1;
                hw_ep->tx_reinit = 1;
@@ -2007,6 +2028,21 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
        if (musb->ops->quirks)
                musb->io.quirks = musb->ops->quirks;
 
+       /* At least tusb6010 has it's own offsets.. */
+       if (musb->ops->ep_offset)
+               musb->io.ep_offset = musb->ops->ep_offset;
+       if (musb->ops->ep_select)
+               musb->io.ep_select = musb->ops->ep_select;
+
+       /* ..and some devices use indexed offset or flat offset */
+       if (musb->io.quirks & MUSB_INDEXED_EP) {
+               musb->io.ep_offset = musb_indexed_ep_offset;
+               musb->io.ep_select = musb_indexed_ep_select;
+       } else {
+               musb->io.ep_offset = musb_flat_ep_offset;
+               musb->io.ep_select = musb_flat_ep_select;
+       }
+
        if (musb->ops->fifo_offset)
                musb->io.fifo_offset = musb->ops->fifo_offset;
        else
index e5410bc67df6f1022ac6bdb72b94e41abc7a29db..d9248fdd9158e2885a72308b49f2b1dda02ea005 100644 (file)
@@ -124,41 +124,6 @@ enum musb_g_ep0_state {
 #define OTG_TIME_A_AIDL_BDIS   200             /* min 200 msec */
 #define OTG_TIME_B_ASE0_BRST   100             /* min 3.125 ms */
 
-
-/*************************** REGISTER ACCESS ********************************/
-
-/* Endpoint registers (other than dynfifo setup) can be accessed either
- * directly with the "flat" model, or after setting up an index register.
- */
-
-#if defined(CONFIG_ARCH_DAVINCI) || defined(CONFIG_SOC_OMAP2430) \
-               || defined(CONFIG_SOC_OMAP3430) || defined(CONFIG_BLACKFIN) \
-               || defined(CONFIG_ARCH_OMAP4)
-/* REVISIT indexed access seemed to
- * misbehave (on DaVinci) for at least peripheral IN ...
- */
-#define        MUSB_FLAT_REG
-#endif
-
-/* TUSB mapping: "flat" plus ep0 special cases */
-#if defined(CONFIG_USB_MUSB_TUSB6010) || \
-       defined(CONFIG_USB_MUSB_TUSB6010_MODULE)
-#define musb_ep_select(_mbase, _epnum) \
-       musb_writeb((_mbase), MUSB_INDEX, (_epnum))
-#define        MUSB_EP_OFFSET                  MUSB_TUSB_OFFSET
-
-/* "flat" mapping: each endpoint has its own i/o address */
-#elif  defined(MUSB_FLAT_REG)
-#define musb_ep_select(_mbase, _epnum) (((void)(_mbase)), ((void)(_epnum)))
-#define        MUSB_EP_OFFSET                  MUSB_FLAT_OFFSET
-
-/* "indexed" mapping: INDEX register controls register bank select */
-#else
-#define musb_ep_select(_mbase, _epnum) \
-       musb_writeb((_mbase), MUSB_INDEX, (_epnum))
-#define        MUSB_EP_OFFSET                  MUSB_INDEXED_OFFSET
-#endif
-
 /****************************** FUNCTIONS ********************************/
 
 #define MUSB_HST_MODE(_musb)\
@@ -515,7 +480,7 @@ static inline int musb_read_fifosize(struct musb *musb,
        u8 reg = 0;
 
        /* read from core using indexed model */
-       reg = musb_readb(mbase, MUSB_EP_OFFSET(epnum, MUSB_FIFOSIZE));
+       reg = musb_readb(mbase, musb->io.ep_offset(epnum, MUSB_FIFOSIZE));
        /* 0's returned when no more endpoints */
        if (!reg)
                return -ENODEV;
index 440333fcf3a7635c050c7b510272a589785d5c6e..53bd0e71d19f02e3582db6ac21d0e617765c0ad1 100644 (file)
@@ -633,6 +633,7 @@ static int dsps_musb_reset(struct musb *musb)
 }
 
 static struct musb_platform_ops dsps_ops = {
+       .quirks         = MUSB_INDEXED_EP,
        .init           = dsps_musb_init,
        .exit           = dsps_musb_exit,
 
index 14aa21747b0ad37bcb2071c32db9eb06a14480c6..8a57a6f4b3a637705260b3c20fb6ee5f0503b8cc 100644 (file)
@@ -37,6 +37,8 @@
 
 #include <linux/io.h>
 
+#define musb_ep_select(_mbase, _epnum) musb->io.ep_select((_mbase), (_epnum))
+
 /**
  * struct musb_io - IO functions for MUSB
  * @quirks:    platform specific flags
index b2b1f736392e3848d03062b14f0f99094ee9d143..92b4c3df9ffa22fee3697931e1ee040be229bd1e 100644 (file)
 #define MUSB_FIFOSIZE          0x0F
 #define MUSB_CONFIGDATA                MUSB_FIFOSIZE   /* Re-used for EP0 */
 
-/* Offsets to endpoint registers in indexed model (using INDEX register) */
-#define MUSB_INDEXED_OFFSET(_epnum, _offset)   \
-       (0x10 + (_offset))
-
-/* Offsets to endpoint registers in flat models */
-#define MUSB_FLAT_OFFSET(_epnum, _offset)      \
-       (0x100 + (0x10*(_epnum)) + (_offset))
-
 #if defined(CONFIG_USB_MUSB_TUSB6010) ||       \
        defined(CONFIG_USB_MUSB_TUSB6010_MODULE)
-/* TUSB6010 EP0 configuration register is special */
-#define MUSB_TUSB_OFFSET(_epnum, _offset)      \
-       (0x10 + _offset)
 #include "tusb6010.h"          /* Needed "only" for TUSB_EP0_CONF */
 #endif
 
index e8e9f9aab203ac55ef139a86eaaa5a911067b249..ab7ec09a8afe5200b65ba773ee4cab675aa4d855 100644 (file)
@@ -195,6 +195,7 @@ static int dma_channel_abort(struct dma_channel *channel)
 {
        struct musb_dma_channel *musb_channel = channel->private_data;
        void __iomem *mbase = musb_channel->controller->base;
+       struct musb *musb = musb_channel->controller->private_data;
 
        u8 bchannel = musb_channel->idx;
        int offset;
@@ -202,7 +203,7 @@ static int dma_channel_abort(struct dma_channel *channel)
 
        if (channel->status == MUSB_DMA_STATUS_BUSY) {
                if (musb_channel->transmit) {
-                       offset = MUSB_EP_OFFSET(musb_channel->epnum,
+                       offset = musb->io.ep_offset(musb_channel->epnum,
                                                MUSB_TXCSR);
 
                        /*
@@ -215,7 +216,7 @@ static int dma_channel_abort(struct dma_channel *channel)
                        csr &= ~MUSB_TXCSR_DMAMODE;
                        musb_writew(mbase, offset, csr);
                } else {
-                       offset = MUSB_EP_OFFSET(musb_channel->epnum,
+                       offset = musb->io.ep_offset(musb_channel->epnum,
                                                MUSB_RXCSR);
 
                        csr = musb_readw(mbase, offset);
@@ -326,7 +327,7 @@ static irqreturn_t dma_controller_irq(int irq, void *private_data)
                                            (musb_channel->max_packet_sz - 1)))
                                    ) {
                                        u8  epnum  = musb_channel->epnum;
-                                       int offset = MUSB_EP_OFFSET(epnum,
+                                       int offset = musb->io.ep_offset(epnum,
                                                                    MUSB_TXCSR);
                                        u16 txcsr;
 
index 16c4475e640c70ac016cb00ee0f02b527cca09eb..3a5ffd575438e5d26f53ad8fe8fa52ea82834028 100644 (file)
@@ -131,6 +131,17 @@ static u32 tusb_fifo_offset(u8 epnum)
        return 0x200 + (epnum * 0x20);
 }
 
+static u32 tusb_ep_offset(u8 epnum, u16 offset)
+{
+       return 0x10 + offset;
+}
+
+/* TUSB mapping: "flat" plus ep0 special cases */
+static void tusb_ep_select(void __iomem *mbase, u8 epnum)
+{
+       musb_writeb(mbase, MUSB_INDEX, epnum);
+}
+
 /*
  * TUSB6010 doesn't allow 8-bit access; 16-bit access is the minimum.
  */
@@ -1174,6 +1185,8 @@ static const struct musb_platform_ops tusb_ops = {
        .init           = tusb_musb_init,
        .exit           = tusb_musb_exit,
 
+       .ep_offset      = tusb_ep_offset,
+       .ep_select      = tusb_ep_select,
        .fifo_offset    = tusb_fifo_offset,
        .readb          = tusb_readb,
        .writeb         = tusb_writeb,
index 1d631d5f4a27bb26d56071c8de5c82b327781859..06e8b3523a0a86c31518e6d644b20089c81f48db 100644 (file)
@@ -188,6 +188,7 @@ static int ux500_musb_exit(struct musb *musb)
 }
 
 static const struct musb_platform_ops ux500_ops = {
+       .quirks         = MUSB_INDEXED_EP,
        .init           = ux500_musb_init,
        .exit           = ux500_musb_exit,