[POWERPC] 83xx: Add platform_device for USB DR peripheral driver
Li Yang [Wed, 7 Feb 2007 05:49:24 +0000 (13:49 +0800)]
Add platform_device setup code for OTG/peripheral mode of 834x DR module.
It is needed for USB client driver to work.

Signed-off-by: Li Yang <leoli@freescale.com>
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>

arch/powerpc/sysdev/fsl_soc.c

index 9f2a9a4..34161bc 100644 (file)
@@ -441,7 +441,8 @@ static int __init fsl_usb_of_init(void)
 {
        struct device_node *np;
        unsigned int i;
-       struct platform_device *usb_dev_mph = NULL, *usb_dev_dr = NULL;
+       struct platform_device *usb_dev_mph = NULL, *usb_dev_dr_host = NULL,
+               *usb_dev_dr_client = NULL;
        int ret;
 
        for (np = NULL, i = 0;
@@ -507,33 +508,72 @@ static int __init fsl_usb_of_init(void)
 
                of_irq_to_resource(np, 0, &r[1]);
 
-               usb_dev_dr =
-                   platform_device_register_simple("fsl-ehci", i, r, 2);
-               if (IS_ERR(usb_dev_dr)) {
-                       ret = PTR_ERR(usb_dev_dr);
+               prop = get_property(np, "dr_mode", NULL);
+
+               if (!prop || !strcmp(prop, "host")) {
+                       usb_data.operating_mode = FSL_USB2_DR_HOST;
+                       usb_dev_dr_host = platform_device_register_simple(
+                                       "fsl-ehci", i, r, 2);
+                       if (IS_ERR(usb_dev_dr_host)) {
+                               ret = PTR_ERR(usb_dev_dr_host);
+                               goto err;
+                       }
+               } else if (prop && !strcmp(prop, "peripheral")) {
+                       usb_data.operating_mode = FSL_USB2_DR_DEVICE;
+                       usb_dev_dr_client = platform_device_register_simple(
+                                       "fsl-usb2-udc", i, r, 2);
+                       if (IS_ERR(usb_dev_dr_client)) {
+                               ret = PTR_ERR(usb_dev_dr_client);
+                               goto err;
+                       }
+               } else if (prop && !strcmp(prop, "otg")) {
+                       usb_data.operating_mode = FSL_USB2_DR_OTG;
+                       usb_dev_dr_host = platform_device_register_simple(
+                                       "fsl-ehci", i, r, 2);
+                       if (IS_ERR(usb_dev_dr_host)) {
+                               ret = PTR_ERR(usb_dev_dr_host);
+                               goto err;
+                       }
+                       usb_dev_dr_client = platform_device_register_simple(
+                                       "fsl-usb2-udc", i, r, 2);
+                       if (IS_ERR(usb_dev_dr_client)) {
+                               ret = PTR_ERR(usb_dev_dr_client);
+                               goto err;
+                       }
+               } else {
+                       ret = -EINVAL;
                        goto err;
                }
 
-               usb_dev_dr->dev.coherent_dma_mask = 0xffffffffUL;
-               usb_dev_dr->dev.dma_mask = &usb_dev_dr->dev.coherent_dma_mask;
-
-               usb_data.operating_mode = FSL_USB2_DR_HOST;
-
                prop = get_property(np, "phy_type", NULL);
                usb_data.phy_mode = determine_usb_phy(prop);
 
-               ret =
-                   platform_device_add_data(usb_dev_dr, &usb_data,
-                                            sizeof(struct
-                                                   fsl_usb2_platform_data));
-               if (ret)
-                       goto unreg_dr;
+               if (usb_dev_dr_host) {
+                       usb_dev_dr_host->dev.coherent_dma_mask = 0xffffffffUL;
+                       usb_dev_dr_host->dev.dma_mask = &usb_dev_dr_host->
+                               dev.coherent_dma_mask;
+                       if ((ret = platform_device_add_data(usb_dev_dr_host,
+                                               &usb_data, sizeof(struct
+                                               fsl_usb2_platform_data))))
+                               goto unreg_dr;
+               }
+               if (usb_dev_dr_client) {
+                       usb_dev_dr_client->dev.coherent_dma_mask = 0xffffffffUL;
+                       usb_dev_dr_client->dev.dma_mask = &usb_dev_dr_client->
+                               dev.coherent_dma_mask;
+                       if ((ret = platform_device_add_data(usb_dev_dr_client,
+                                               &usb_data, sizeof(struct
+                                               fsl_usb2_platform_data))))
+                               goto unreg_dr;
+               }
        }
        return 0;
 
 unreg_dr:
-       if (usb_dev_dr)
-               platform_device_unregister(usb_dev_dr);
+       if (usb_dev_dr_host)
+               platform_device_unregister(usb_dev_dr_host);
+       if (usb_dev_dr_client)
+               platform_device_unregister(usb_dev_dr_client);
 unreg_mph:
        if (usb_dev_mph)
                platform_device_unregister(usb_dev_mph);
@@ -699,7 +739,7 @@ static int __init fs_enet_of_init(void)
                                if (ret)
                                        goto unreg;
                        }
-                       
+
                        of_node_put(phy);
                        of_node_put(mdio);