Hi Sebastian,
2013/7/5 Sebastian Andrzej Siewior <[email protected]>:
> 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 <[email protected]>
> ---
> 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 [email protected]
> 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-usb" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html