add platform_device for USB DR pheripheral driver
PATCH 2/3 add platform_device for USB DR pheripheral driver
Add platform_device setup code for OTG/peripheral mode of 834x DR module. It is needed for USB client driver to work.
---arch/powerpc/sysdev/fsl_soc.c | 76 +++++++++++++++++++++++++++++++----------
1 files changed, 58 insertions(+), 18 deletions(-)
arch/powerpc/sysdev/fsl_soc.c +0 -0
@@ -440,7 +440,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;@@ -506,33 +507,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 || (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);
Quoted 23 lines · Li Yang
Add
platform_devicesetup code for OTG/peripheral mode of 834x DR module. It is needed for USB client driver to work.Signed-off-by Li Yang <[email protected]>---
arch/powerpc/sysdev/fsl_soc.c| 76 ++++++++++++++++++++++++++++++
+----------1 files changed, 58 insertions(+), 18 deletions(-)arch/powerpc/sysdev/fsl_soc.c +2
-1@@ -440,7 +440,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;
arch/powerpc/sysdev/fsl_soc.c static int __init fsl_usb_of_init(void) · line 509
Quoted 7 lines
arch/powerpc/sysdev/fsl_soc.c +2
-4@@ -506,33 +507,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 ); +
We should handle the !prop case as equivalent to "host". The reason is that if I accept this patch its going to break people until the usb side is also in. I'd prefer to maintain the exact meaning of 'dr_mode' not existing as 'host'.
Quoted 21 lines
arch/powerpc/sysdev/fsl_soc.c +21
-0+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 || (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)) {
arch/powerpc/sysdev/fsl_soc.c static int __init fsl_usb_of_init(void) · line 540
Quoted 10 lines
arch/powerpc/sysdev/fsl_soc.c +10
-0+ 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 {
- k