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 <bige...@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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to