diff mbox

[4/5] usb: musb: dsps: use proper child nodes

Message ID 1373031178-8871-5-git-send-email-bigeasy@linutronix.de (mailing list archive)
State New, archived
Headers show

Commit Message

Sebastian Andrzej Siewior July 5, 2013, 1:32 p.m. UTC
This moves the two instances from the big node into two child nodes. The
glue layer ontop does almost nothing.
This could be two indepentant child nodes but I have no idea how
'ti,hwmods = "usb_otg_hs";' affects the two musb controler.

Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
---
 arch/arm/boot/dts/am335x-bone.dts  |  8 ++++++
 arch/arm/boot/dts/am335x-evm.dts   | 16 ++++++++++++
 arch/arm/boot/dts/am335x-evmsk.dts | 16 ++++++++++++
 arch/arm/boot/dts/am33xx.dtsi      | 47 ++++++++++++++++++++++++-----------
 drivers/usb/musb/musb_dsps.c       | 51 ++++++++++++++++++--------------------
 5 files changed, 97 insertions(+), 41 deletions(-)

Comments

Enric Balletbo Serra July 5, 2013, 3:08 p.m. UTC | #1
Hi Sebastian,

2013/7/5 Sebastian Andrzej Siewior <bigeasy@linutronix.de>:
> This moves the two instances from the big node into two child nodes. The
> glue layer ontop does almost nothing.
> This could be two indepentant child nodes but I have no idea how
> 'ti,hwmods = "usb_otg_hs";' affects the two musb controler.
>
> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
> ---
>  arch/arm/boot/dts/am335x-bone.dts  |  8 ++++++
>  arch/arm/boot/dts/am335x-evm.dts   | 16 ++++++++++++
>  arch/arm/boot/dts/am335x-evmsk.dts | 16 ++++++++++++
>  arch/arm/boot/dts/am33xx.dtsi      | 47 ++++++++++++++++++++++++-----------
>  drivers/usb/musb/musb_dsps.c       | 51 ++++++++++++++++++--------------------
>  5 files changed, 97 insertions(+), 41 deletions(-)
>
> diff --git a/arch/arm/boot/dts/am335x-bone.dts b/arch/arm/boot/dts/am335x-bone.dts
> index 83184e5..ae50fd7 100644
> --- a/arch/arm/boot/dts/am335x-bone.dts
> +++ b/arch/arm/boot/dts/am335x-bone.dts
> @@ -124,6 +124,14 @@
>                         status = "okay";
>                 };
>
> +               musb: usb@47400000 {
> +                       status = "okay";
> +
> +                       usb0@47401000 {
> +                               status = "okay";
> +                       };
> +               };
> +
>                 i2c0: i2c@44e0b000 {
>                         pinctrl-names = "default";
>                         pinctrl-0 = <&i2c0_pins>;
> diff --git a/arch/arm/boot/dts/am335x-evm.dts b/arch/arm/boot/dts/am335x-evm.dts
> index 317637a..dc236f4 100644
> --- a/arch/arm/boot/dts/am335x-evm.dts
> +++ b/arch/arm/boot/dts/am335x-evm.dts
> @@ -175,6 +175,22 @@
>                         status = "okay";
>                 };
>
> +               musb1_phy: phy1@47401800 {
> +                       status = "okay";
> +               };
> +
> +               musb: usb@47400000 {
> +                       status = "okay";
> +
> +                       usb0@47401000 {
> +                               status = "okay";
> +                       };
> +
> +                       usb1@47401800 {
> +                               status = "okay";
> +                       };
> +               };
> +
>                 i2c1: i2c@4802a000 {
>                         pinctrl-names = "default";
>                         pinctrl-0 = <&i2c1_pins>;
> diff --git a/arch/arm/boot/dts/am335x-evmsk.dts b/arch/arm/boot/dts/am335x-evmsk.dts
> index 99d9444..74ce579 100644
> --- a/arch/arm/boot/dts/am335x-evmsk.dts
> +++ b/arch/arm/boot/dts/am335x-evmsk.dts
> @@ -211,6 +211,22 @@
>                         status = "okay";
>                 };
>
> +               musb1_phy: phy1@47401800 {
> +                       status = "okay";
> +               };
> +
> +               musb: usb@47400000 {
> +                       status = "okay";
> +
> +                       usb0@47401000 {
> +                               status = "okay";
> +                       };
> +
> +                       usb1@47401800 {
> +                               status = "okay";
> +                       };
> +               };
> +
>                 epwmss2: epwmss@48304000 {
>                         status = "okay";
>
> diff --git a/arch/arm/boot/dts/am33xx.dtsi b/arch/arm/boot/dts/am33xx.dtsi
> index 66bb420..bb2298c 100644
> --- a/arch/arm/boot/dts/am33xx.dtsi
> +++ b/arch/arm/boot/dts/am33xx.dtsi
> @@ -349,22 +349,41 @@
>                         status = "disabled";
>                 };
>
> -               usb@47400000 {
> +               musb: usb@47400000 {
>                         compatible = "ti,musb-am33xx";
> -                       reg = <0x47400000 0x1000        /* usbss */
> -                              0x47401000 0x800         /* musb instance 0 */
> -                              0x47401800 0x800>;       /* musb instance 1 */
> -                       interrupts = <17                /* usbss */
> -                                     18                /* musb instance 0 */
> -                                     19>;              /* musb instance 1 */
> -                       multipoint = <1>;
> -                       num-eps = <16>;
> -                       ram-bits = <12>;
> -                       port0-mode = <3>;
> -                       port1-mode = <3>;
> -                       power = <250>;
> +                       reg = <0x47400000 0x1000>;
> +                       ranges;
> +                       #address-cells = <1>;
> +                       #size-cells = <1>;
> +                       interrupts = <17>;
>                         ti,hwmods = "usb_otg_hs";
> -                       phys = <&musb1_phy>;
> +                       status = "disabled";
> +
> +                       usb0@47401000 {
> +                               reg = <0x47401000 0x800>;
> +                               interrupts = <18>;
> +                               interrupt-names = "mc";
> +                               multipoint = <1>;
> +                               num-eps = <16>;
> +                               ram-bits = <12>;
> +                               port-mode = <3>;
> +                               power = <250>;
> +                               phys = <&musb0_phy>;
> +                               status = "disabled";
> +                       };
> +
> +                       usb1@47401800 {
> +                               reg = <0x47401800 0x800>;
> +                               interrupts = <19>;
> +                               interrupt-names = "mc";
> +                               multipoint = <1>;
> +                               num-eps = <16>;
> +                               ram-bits = <12>;
> +                               port-mode = <3>;
> +                               power = <250>;
> +                               phys = <&musb1_phy>;
> +                               status = "disabled";
> +                       };
>                 };
>
>                 epwmss0: epwmss@48300000 {
> diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c
> index 22ad532..0e01cc1 100644
> --- a/drivers/usb/musb/musb_dsps.c
> +++ b/drivers/usb/musb/musb_dsps.c
> @@ -43,6 +43,7 @@
>  #include <linux/of.h>
>  #include <linux/of_device.h>
>  #include <linux/of_address.h>
> +#include <linux/of_irq.h>
>
>  #include "musb_core.h"
>
> @@ -375,9 +376,9 @@ static int dsps_musb_init(struct musb *musb)
>         musb->mregs += wrp->musb_core_offset;
>
>         /* NOP driver needs change if supporting dual instance */
> -       musb->xceiv = devm_usb_get_phy_by_phandle(glue->dev, "phys", 0);
> -       if (IS_ERR_OR_NULL(musb->xceiv))
> -               return -EPROBE_DEFER;
> +       musb->xceiv = devm_usb_get_phy_by_phandle(dev, "phys", 0);
> +       if (IS_ERR(musb->xceiv))
> +               return PTR_ERR(musb->xceiv);
>
>         /* Returns zero if e.g. not clocked */
>         rev = dsps_readl(reg_base, wrp->revision);
> @@ -429,39 +430,32 @@ static struct musb_platform_ops dsps_ops = {
>
>  static u64 musb_dmamask = DMA_BIT_MASK(32);
>
> -static int dsps_create_musb_pdev(struct dsps_glue *glue, u8 id)
> +static int dsps_create_musb_pdev(struct dsps_glue *glue, u8 id,
> +               struct device_node *np)
>  {
>         struct device *dev = glue->dev;
>         struct platform_device *pdev = to_platform_device(dev);
>         struct musb_hdrc_platform_data  *pdata = dev->platform_data;
> -       struct device_node *np = pdev->dev.of_node;
>         struct musb_hdrc_config *config;
>         struct platform_device  *musb;
> -       struct resource *res;
>         struct resource resources[2];
> -       char res_name[11];
>         int ret;
>
> -       /* first resource is for usbss, so start index from 1 */
> -       res = platform_get_resource(pdev, IORESOURCE_MEM, id + 1);
> -       if (!res) {
> +       ret = of_address_to_resource(np, 0, &resources[0]);
> +       if (ret) {
>                 dev_err(dev, "failed to get memory for instance %d\n", id);
> -               ret = -ENODEV;
>                 goto err0;
>         }
> -       res->parent = NULL;
> -       resources[0] = *res;
>
>         /* first resource is for usbss, so start index from 1 */
> -       res = platform_get_resource(pdev, IORESOURCE_IRQ, id + 1);
> -       if (!res) {
> +       ret = of_irq_to_resource(np, 0, &resources[1]);
> +       if (ret == 0) {
>                 dev_err(dev, "failed to get irq for instance %d\n", id);
> -               ret = -ENODEV;
> +               ret = -EINVAL;
>                 goto err0;
>         }
> -       res->parent = NULL;
> -       resources[1] = *res;
> -       resources[1].name = "mc";
> +       resources[0].parent = NULL;
> +       resources[1].parent = NULL;
>
>         /* allocate the child platform device */
>         musb = platform_device_alloc("musb-hdrc", PLATFORM_DEVID_AUTO);
> @@ -474,6 +468,7 @@ static int dsps_create_musb_pdev(struct dsps_glue *glue, u8 id)
>         musb->dev.parent                = dev;
>         musb->dev.dma_mask              = &musb_dmamask;
>         musb->dev.coherent_dma_mask     = musb_dmamask;
> +       musb->dev.of_node               = of_node_get(np);
>
>         glue->musb[id]                  = musb;
>
> @@ -502,8 +497,7 @@ static int dsps_create_musb_pdev(struct dsps_glue *glue, u8 id)
>
>                 of_property_read_u32(np, "num-eps", (u32 *)&config->num_eps);
>                 of_property_read_u32(np, "ram-bits", (u32 *)&config->ram_bits);
> -               snprintf(res_name, sizeof(res_name), "port%d-mode", id);
> -               of_property_read_u32(np, res_name, (u32 *)&pdata->mode);
> +               of_property_read_u32(np, "port-mode", (u32 *)&pdata->mode);
>                 of_property_read_u32(np, "power", (u32 *)&pdata->power);
>                 config->multipoint = of_property_read_bool(np, "multipoint");
>
> @@ -537,6 +531,7 @@ static int dsps_probe(struct platform_device *pdev)
>         const struct of_device_id *match;
>         const struct dsps_musb_wrapper *wrp;
>         struct dsps_glue *glue;
> +       struct device_node *child;
>         struct resource *iomem;
>         int ret, i;
>
> @@ -583,9 +578,9 @@ static int dsps_probe(struct platform_device *pdev)
>                 goto err2;
>         }
>
> -       /* create the child platform device for all instances of musb */
> -       for (i = 0; i < wrp->instances ; i++) {
> -               ret = dsps_create_musb_pdev(glue, i);
> +       i = 0;
> +       for_each_available_child_of_node(pdev->dev.of_node, child) {
> +               ret = dsps_create_musb_pdev(glue, i, child);
>                 if (ret != 0) {
>                         dev_err(&pdev->dev, "failed to create child pdev\n");
>                         /* release resources of previously created instances */
> @@ -593,6 +588,7 @@ static int dsps_probe(struct platform_device *pdev)
>                                 platform_device_unregister(glue->musb[i]);
>                         goto err3;
>                 }
> +               i++;
>         }
>
>         return 0;
> @@ -610,12 +606,13 @@ static int dsps_probe(struct platform_device *pdev)
>  static int dsps_remove(struct platform_device *pdev)
>  {
>         struct dsps_glue *glue = platform_get_drvdata(pdev);
> -       const struct dsps_musb_wrapper *wrp = glue->wrp;
>         int i;
>
>         /* delete the child platform device */
> -       for (i = 0; i < wrp->instances ; i++)
> -               platform_device_unregister(glue->musb[i]);
> +       for (i = 0; i < ARRAY_SIZE(glue->musb); i++) {
> +               if (glue->musb[i])
> +                       platform_device_unregister(glue->musb[i]);
> +       }
>
>         /* disable usbss clocks */
>         pm_runtime_put(&pdev->dev);
> --
> 1.8.3.2
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html


I'm trying to test these patches but I've problems, I've following error,

[   10.096492] musb-dsps 47400000.usb: failed to get memory for instance 0
[   10.103481] musb-dsps 47400000.usb: failed to create child pdev

I'm missing something ?

Thanks in advance,
     Enric
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Sebastian Andrzej Siewior July 5, 2013, 3:15 p.m. UTC | #2
On 07/05/2013 05:08 PM, Enric Balletbo Serra wrote:
> Hi Sebastian,

Hi Enric,

> I'm trying to test these patches but I've problems, I've following error,
> 
> [   10.096492] musb-dsps 47400000.usb: failed to get memory for instance 0
> [   10.103481] musb-dsps 47400000.usb: failed to create child pdev
> 
> I'm missing something ?

This is printed if you don't have the memory for the child device. Did
you update your device tree?

> 
> Thanks in advance,
>      Enric

Sebastian
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Enric Balletbo Serra July 5, 2013, 3:22 p.m. UTC | #3
2013/7/5 Sebastian Andrzej Siewior <bigeasy@linutronix.de>:
> On 07/05/2013 05:08 PM, Enric Balletbo Serra wrote:
>> Hi Sebastian,
>
> Hi Enric,
>
>> I'm trying to test these patches but I've problems, I've following error,
>>
>> [   10.096492] musb-dsps 47400000.usb: failed to get memory for instance 0
>> [   10.103481] musb-dsps 47400000.usb: failed to create child pdev
>>
>> I'm missing something ?
>
> This is printed if you don't have the memory for the child device. Did
> you update your device tree?
>
Fixed, I didn't update my DT for my custom board properly. Thanks.

>>
>> Thanks in advance,
>>      Enric
>
> Sebastian
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Sebastian Andrzej Siewior July 5, 2013, 3:24 p.m. UTC | #4
On 07/05/2013 05:22 PM, Enric Balletbo Serra wrote:
> Fixed, I didn't update my DT for my custom board properly. Thanks.

Good. I hate breaking the compatibility for DT but unfortunately it is
beyond repair.

Sebastian

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Felipe Balbi July 25, 2013, 2:30 p.m. UTC | #5
On Fri, Jul 05, 2013 at 03:32:57PM +0200, Sebastian Andrzej Siewior wrote:
> This moves the two instances from the big node into two child nodes. The
> glue layer ontop does almost nothing.
> This could be two indepentant child nodes but I have no idea how
> 'ti,hwmods = "usb_otg_hs";' affects the two musb controler.
> 
> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>

pretty good :-)
diff mbox

Patch

diff --git a/arch/arm/boot/dts/am335x-bone.dts b/arch/arm/boot/dts/am335x-bone.dts
index 83184e5..ae50fd7 100644
--- a/arch/arm/boot/dts/am335x-bone.dts
+++ b/arch/arm/boot/dts/am335x-bone.dts
@@ -124,6 +124,14 @@ 
 			status = "okay";
 		};
 
+		musb: usb@47400000 {
+			status = "okay";
+
+			usb0@47401000 {
+				status = "okay";
+			};
+		};
+
 		i2c0: i2c@44e0b000 {
 			pinctrl-names = "default";
 			pinctrl-0 = <&i2c0_pins>;
diff --git a/arch/arm/boot/dts/am335x-evm.dts b/arch/arm/boot/dts/am335x-evm.dts
index 317637a..dc236f4 100644
--- a/arch/arm/boot/dts/am335x-evm.dts
+++ b/arch/arm/boot/dts/am335x-evm.dts
@@ -175,6 +175,22 @@ 
 			status = "okay";
 		};
 
+		musb1_phy: phy1@47401800 {
+			status = "okay";
+		};
+
+		musb: usb@47400000 {
+			status = "okay";
+
+			usb0@47401000 {
+				status = "okay";
+			};
+
+			usb1@47401800 {
+				status = "okay";
+			};
+		};
+
 		i2c1: i2c@4802a000 {
 			pinctrl-names = "default";
 			pinctrl-0 = <&i2c1_pins>;
diff --git a/arch/arm/boot/dts/am335x-evmsk.dts b/arch/arm/boot/dts/am335x-evmsk.dts
index 99d9444..74ce579 100644
--- a/arch/arm/boot/dts/am335x-evmsk.dts
+++ b/arch/arm/boot/dts/am335x-evmsk.dts
@@ -211,6 +211,22 @@ 
 			status = "okay";
 		};
 
+		musb1_phy: phy1@47401800 {
+			status = "okay";
+		};
+
+		musb: usb@47400000 {
+			status = "okay";
+
+			usb0@47401000 {
+				status = "okay";
+			};
+
+			usb1@47401800 {
+				status = "okay";
+			};
+		};
+
 		epwmss2: epwmss@48304000 {
 			status = "okay";
 
diff --git a/arch/arm/boot/dts/am33xx.dtsi b/arch/arm/boot/dts/am33xx.dtsi
index 66bb420..bb2298c 100644
--- a/arch/arm/boot/dts/am33xx.dtsi
+++ b/arch/arm/boot/dts/am33xx.dtsi
@@ -349,22 +349,41 @@ 
 			status = "disabled";
 		};
 
-		usb@47400000 {
+		musb: usb@47400000 {
 			compatible = "ti,musb-am33xx";
-			reg = <0x47400000 0x1000	/* usbss */
-			       0x47401000 0x800		/* musb instance 0 */
-			       0x47401800 0x800>;	/* musb instance 1 */
-			interrupts = <17		/* usbss */
-				      18		/* musb instance 0 */
-				      19>;		/* musb instance 1 */
-			multipoint = <1>;
-			num-eps = <16>;
-			ram-bits = <12>;
-			port0-mode = <3>;
-			port1-mode = <3>;
-			power = <250>;
+			reg = <0x47400000 0x1000>;
+			ranges;
+			#address-cells = <1>;
+			#size-cells = <1>;
+			interrupts = <17>;
 			ti,hwmods = "usb_otg_hs";
-			phys = <&musb1_phy>;
+			status = "disabled";
+
+			usb0@47401000 {
+				reg = <0x47401000 0x800>;
+				interrupts = <18>;
+				interrupt-names = "mc";
+				multipoint = <1>;
+				num-eps = <16>;
+				ram-bits = <12>;
+				port-mode = <3>;
+				power = <250>;
+				phys = <&musb0_phy>;
+				status = "disabled";
+			};
+
+			usb1@47401800 {
+				reg = <0x47401800 0x800>;
+				interrupts = <19>;
+				interrupt-names = "mc";
+				multipoint = <1>;
+				num-eps = <16>;
+				ram-bits = <12>;
+				port-mode = <3>;
+				power = <250>;
+				phys = <&musb1_phy>;
+				status = "disabled";
+			};
 		};
 
 		epwmss0: epwmss@48300000 {
diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c
index 22ad532..0e01cc1 100644
--- a/drivers/usb/musb/musb_dsps.c
+++ b/drivers/usb/musb/musb_dsps.c
@@ -43,6 +43,7 @@ 
 #include <linux/of.h>
 #include <linux/of_device.h>
 #include <linux/of_address.h>
+#include <linux/of_irq.h>
 
 #include "musb_core.h"
 
@@ -375,9 +376,9 @@  static int dsps_musb_init(struct musb *musb)
 	musb->mregs += wrp->musb_core_offset;
 
 	/* NOP driver needs change if supporting dual instance */
-	musb->xceiv = devm_usb_get_phy_by_phandle(glue->dev, "phys", 0);
-	if (IS_ERR_OR_NULL(musb->xceiv))
-		return -EPROBE_DEFER;
+	musb->xceiv = devm_usb_get_phy_by_phandle(dev, "phys", 0);
+	if (IS_ERR(musb->xceiv))
+		return PTR_ERR(musb->xceiv);
 
 	/* Returns zero if e.g. not clocked */
 	rev = dsps_readl(reg_base, wrp->revision);
@@ -429,39 +430,32 @@  static struct musb_platform_ops dsps_ops = {
 
 static u64 musb_dmamask = DMA_BIT_MASK(32);
 
-static int dsps_create_musb_pdev(struct dsps_glue *glue, u8 id)
+static int dsps_create_musb_pdev(struct dsps_glue *glue, u8 id,
+		struct device_node *np)
 {
 	struct device *dev = glue->dev;
 	struct platform_device *pdev = to_platform_device(dev);
 	struct musb_hdrc_platform_data  *pdata = dev->platform_data;
-	struct device_node *np = pdev->dev.of_node;
 	struct musb_hdrc_config	*config;
 	struct platform_device	*musb;
-	struct resource *res;
 	struct resource	resources[2];
-	char res_name[11];
 	int ret;
 
-	/* first resource is for usbss, so start index from 1 */
-	res = platform_get_resource(pdev, IORESOURCE_MEM, id + 1);
-	if (!res) {
+	ret = of_address_to_resource(np, 0, &resources[0]);
+	if (ret) {
 		dev_err(dev, "failed to get memory for instance %d\n", id);
-		ret = -ENODEV;
 		goto err0;
 	}
-	res->parent = NULL;
-	resources[0] = *res;
 
 	/* first resource is for usbss, so start index from 1 */
-	res = platform_get_resource(pdev, IORESOURCE_IRQ, id + 1);
-	if (!res) {
+	ret = of_irq_to_resource(np, 0, &resources[1]);
+	if (ret == 0) {
 		dev_err(dev, "failed to get irq for instance %d\n", id);
-		ret = -ENODEV;
+		ret = -EINVAL;
 		goto err0;
 	}
-	res->parent = NULL;
-	resources[1] = *res;
-	resources[1].name = "mc";
+	resources[0].parent = NULL;
+	resources[1].parent = NULL;
 
 	/* allocate the child platform device */
 	musb = platform_device_alloc("musb-hdrc", PLATFORM_DEVID_AUTO);
@@ -474,6 +468,7 @@  static int dsps_create_musb_pdev(struct dsps_glue *glue, u8 id)
 	musb->dev.parent		= dev;
 	musb->dev.dma_mask		= &musb_dmamask;
 	musb->dev.coherent_dma_mask	= musb_dmamask;
+	musb->dev.of_node		= of_node_get(np);
 
 	glue->musb[id]			= musb;
 
@@ -502,8 +497,7 @@  static int dsps_create_musb_pdev(struct dsps_glue *glue, u8 id)
 
 		of_property_read_u32(np, "num-eps", (u32 *)&config->num_eps);
 		of_property_read_u32(np, "ram-bits", (u32 *)&config->ram_bits);
-		snprintf(res_name, sizeof(res_name), "port%d-mode", id);
-		of_property_read_u32(np, res_name, (u32 *)&pdata->mode);
+		of_property_read_u32(np, "port-mode", (u32 *)&pdata->mode);
 		of_property_read_u32(np, "power", (u32 *)&pdata->power);
 		config->multipoint = of_property_read_bool(np, "multipoint");
 
@@ -537,6 +531,7 @@  static int dsps_probe(struct platform_device *pdev)
 	const struct of_device_id *match;
 	const struct dsps_musb_wrapper *wrp;
 	struct dsps_glue *glue;
+	struct device_node *child;
 	struct resource *iomem;
 	int ret, i;
 
@@ -583,9 +578,9 @@  static int dsps_probe(struct platform_device *pdev)
 		goto err2;
 	}
 
-	/* create the child platform device for all instances of musb */
-	for (i = 0; i < wrp->instances ; i++) {
-		ret = dsps_create_musb_pdev(glue, i);
+	i = 0;
+	for_each_available_child_of_node(pdev->dev.of_node, child) {
+		ret = dsps_create_musb_pdev(glue, i, child);
 		if (ret != 0) {
 			dev_err(&pdev->dev, "failed to create child pdev\n");
 			/* release resources of previously created instances */
@@ -593,6 +588,7 @@  static int dsps_probe(struct platform_device *pdev)
 				platform_device_unregister(glue->musb[i]);
 			goto err3;
 		}
+		i++;
 	}
 
 	return 0;
@@ -610,12 +606,13 @@  static int dsps_probe(struct platform_device *pdev)
 static int dsps_remove(struct platform_device *pdev)
 {
 	struct dsps_glue *glue = platform_get_drvdata(pdev);
-	const struct dsps_musb_wrapper *wrp = glue->wrp;
 	int i;
 
 	/* delete the child platform device */
-	for (i = 0; i < wrp->instances ; i++)
-		platform_device_unregister(glue->musb[i]);
+	for (i = 0; i < ARRAY_SIZE(glue->musb); i++) {
+		if (glue->musb[i])
+			platform_device_unregister(glue->musb[i]);
+	}
 
 	/* disable usbss clocks */
 	pm_runtime_put(&pdev->dev);