usb: musb: ti81xx: allow board file to set usb mode for each port
authorAjay Kumar Gupta <ajay.gupta@ti.com>
Thu, 22 Dec 2011 06:41:47 +0000 (12:11 +0530)
committerVaibhav Hiremath <hvaibhav@ti.com>
Mon, 23 Jan 2012 19:14:47 +0000 (00:44 +0530)
Used existing .mode field of board_data for setting usb mode for both
usb ports. usb0 mode is taken from board_mode[0:3] and usb1 mode is
from board_mode[4:7] bits. As mode can take values only from 0 to 3
so this is safe.

This board mode is later used and corretly set in each port's musb
platform_data's mode.

Signed-off-by: Ajay Kumar Gupta <ajay.gupta@ti.com>
arch/arm/mach-omap2/board-am335xevm.c
drivers/usb/musb/ti81xx.c
drivers/usb/musb/ti81xx.h

index 5b510a01db3a25e2629d07521ffa892ad15a8793..f8b93e0d2387fa0003342efde4f01497466b91d1 100644 (file)
@@ -1718,7 +1718,12 @@ static struct i2c_board_info __initdata am335x_i2c_boardinfo[] = {
 
 static struct omap_musb_board_data musb_board_data = {
        .interface_type = MUSB_INTERFACE_ULPI,
-       .mode           = MUSB_OTG,
+       /*
+        * mode[0:3] = USB0PORT's mode
+        * mode[4:7] = USB1PORT's mode
+        * AM335X beta EVM has USB0 in OTG mode and USB1 in host mode.
+        */
+       .mode           = (MUSB_HOST << 4) | MUSB_OTG,
        .power          = 500,
        .instances      = 1,
 };
index 2f81c92f4d02fefb3f35fbaa8b4f0d649d86e06f..5a5e07c8291befa9c4da10e3161226aac41beb86 100644 (file)
@@ -1158,6 +1158,7 @@ static int __devinit ti81xx_create_musb_pdev(struct ti81xx_glue *glue, u8 id)
        struct device *dev = glue->dev;
        struct platform_device *pdev = to_platform_device(dev);
        struct musb_hdrc_platform_data  *pdata = dev->platform_data;
+       struct omap_musb_board_data *bdata = pdata->board_data;
        struct platform_device  *musb;
        struct resource *res;
        struct resource resources[2];
@@ -1208,6 +1209,15 @@ static int __devinit ti81xx_create_musb_pdev(struct ti81xx_glue *glue, u8 id)
                goto err1;
        }
 
+       if (id == 0)
+               pdata->mode = bdata->mode & USB0PORT_MODEMASK;
+       else
+               pdata->mode = (bdata->mode & USB1PORT_MODEMASK)
+                                       >> USB1PORT_MODESHIFT;
+
+       dev_info(dev, "musb%d, board_mode=0x%x, plat_mode=0x%x\n",
+                                       id, bdata->mode, pdata->mode);
+
        ret = platform_device_add_data(musb, pdata, sizeof(*pdata));
        if (ret) {
                dev_err(dev, "failed to add platform_data\n");
index 95423bfc86e3ae0c3c40b736505fd1c0a8a20771..fe1caf95a89c7f0de5ed3009e9778e5c9cf44996 100644 (file)
 #define        USBMODE_USBID_MUXSEL    0x80
 #define        USBMODE_USBID_HIGH      0x100
 
+#define        USB0PORT_MODEMASK       0x0f
+#define        USB1PORT_MODEMASK       0xf0
+#define USB1PORT_MODESHIFT     4
 extern void usb_nop_xceiv_register(int id);
 #endif