musb: select fifo_mode at runtime
authorRavi B <ravibabu@ti.com>
Mon, 6 Dec 2010 13:01:08 +0000 (18:31 +0530)
committerVaibhav Hiremath <hvaibhav@ti.com>
Mon, 23 Jan 2012 19:14:08 +0000 (00:44 +0530)
OMAP35x han an errata restricting active endpoints to use either
first 8K or next 8K of FIFO space while this issue has been
fixed in OMAP3630.

This issue requires the OMAP35x platform to use fifo_mode=5 but
OMAP3630 and AM35x can use fifo_mode=4 which utilises entire 16K
of FIFO.

Signed-off-by: Ajay Kumar Gupta <ajay.gupta@ti.com>
Signed-off-by: Sriramakrishnan A G <srk@ti.com>
Signed-off-by: Vaibhav Hiremath <hvaibhav@ti.com>
arch/arm/mach-omap2/usb-musb.c
drivers/usb/musb/musb_core.c
include/linux/usb/musb.h

index 8d5ed775dd567c0c55c1450c4465b91e1ee1efc9..8387501c1406a3842dab341b6d91ed4ac5a604b1 100644 (file)
@@ -34,6 +34,7 @@
 #include "mux.h"
 
 static struct musb_hdrc_config musb_config = {
+       .fifo_mode      = 4,
        .multipoint     = 1,
        .dyn_fifo       = 1,
        .num_eps        = 16,
@@ -90,6 +91,14 @@ void __init usb_musb_init(struct omap_musb_board_data *musb_board_data)
        musb_plat.mode = board_data->mode;
        musb_plat.extvbus = board_data->extvbus;
 
+       /*
+        * OMAP3630/AM35x platform has MUSB RTL-1.8 which has the fix for the
+        * issue restricting active endpoints to use first 8K of FIFO space.
+        * This issue restricts OMAP35x platform to use fifo_mode '5'.
+        */
+       if (cpu_is_omap3430())
+               musb_config.fifo_mode = 5;
+
        if (cpu_is_omap3517() || cpu_is_omap3505()) {
                oh_name = "am35x_otg_hs";
                name = "musb-am35x";
index 754cf1192c3b28b40105a2793f4a50fec83129cc..88e661ef4e69b6df56e902a8e8d032eb0f75eda4 100644 (file)
@@ -1235,7 +1235,9 @@ static int __devinit ep_config_from_table(struct musb *musb)
        int                     offset;
        struct musb_hw_ep       *hw_ep = musb->endpoints;
 
-       if (musb->config->fifo_cfg) {
+       if (musb->config->fifo_mode) {
+               fifo_mode = musb->config->fifo_mode;
+       } else if (musb->config->fifo_cfg) {
                cfg = musb->config->fifo_cfg;
                n = musb->config->fifo_cfg_size;
                goto done;
index eb505250940af073cd1059f82c4e48d773df3acb..2c59816c56c59f255191ccd70e8dd0e9065952ef 100644 (file)
@@ -62,6 +62,7 @@ struct musb_hdrc_eps_bits {
 struct musb_hdrc_config {
        struct musb_fifo_cfg    *fifo_cfg;      /* board fifo configuration */
        unsigned                fifo_cfg_size;  /* size of the fifo configuration */
+       unsigned short          fifo_mode;      /* fifo mode to be selected */
 
        /* MUSB configuration-specific details */
        unsigned        multipoint:1;   /* multipoint device */