mirror of
https://github.com/torvalds/linux.git
synced 2024-11-29 23:51:37 +00:00
usb: musb: omap2430: Fix probe regression for missing resources
Probe for omap2430 glue layer is now broken for interrupt resources in all cases. Commit2390710647
("partially Revert "usb: musb: Set the DT node on the child device"") broke probing for SoCs using ti-sysc interconnect target module as the dt node is not found. Commita1a2b7125e
("of/platform: Drop static setup of IRQ resource from DT core") caused omap3 to fail with error "-ENXIO: IRQ mc not found" as the IRQ resources are no longer automatically populated from devicetree. Let's fix the issues by calling device_set_of_node_from_dev() only if the SoC has been updated to probe with ti-sysc. And for legacy SoCs, let's populate the resources manually as needed. Note that once we have updated the SoCs to probe with proper devicetree data in all cases, this is no longer needed. But doing that requires patching both devicetree and SoC code, so let's fix the probe issues first. Fixes:a1a2b7125e
("of/platform: Drop static setup of IRQ resource from DT core") Fixes:2390710647
("partially Revert "usb: musb: Set the DT node on the child device"") Cc: H. Nikolaus Schaller <hns@goldelico.com> Reported-by: Sicelo Mhlongo <absicsz@gmail.com> Tested-by: Sicelo Mhlongo <absicsz@gmail.com> Signed-off-by: Tony Lindgren <tony@atomide.com> Link: https://lore.kernel.org/r/20221118102532.34458-1-tony@atomide.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
53a256ea95
commit
ffbe2feac5
@ -15,6 +15,7 @@
|
||||
#include <linux/list.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
@ -310,6 +311,7 @@ static int omap2430_probe(struct platform_device *pdev)
|
||||
struct device_node *control_node;
|
||||
struct platform_device *control_pdev;
|
||||
int ret = -ENOMEM, val;
|
||||
bool populate_irqs = false;
|
||||
|
||||
if (!np)
|
||||
return -ENODEV;
|
||||
@ -328,6 +330,18 @@ static int omap2430_probe(struct platform_device *pdev)
|
||||
musb->dev.dma_mask = &omap2430_dmamask;
|
||||
musb->dev.coherent_dma_mask = omap2430_dmamask;
|
||||
|
||||
/*
|
||||
* Legacy SoCs using omap_device get confused if node is moved
|
||||
* because of interconnect properties mixed into the node.
|
||||
*/
|
||||
if (of_get_property(np, "ti,hwmods", NULL)) {
|
||||
dev_warn(&pdev->dev, "please update to probe with ti-sysc\n");
|
||||
populate_irqs = true;
|
||||
} else {
|
||||
device_set_of_node_from_dev(&musb->dev, &pdev->dev);
|
||||
}
|
||||
of_node_put(np);
|
||||
|
||||
glue->dev = &pdev->dev;
|
||||
glue->musb = musb;
|
||||
glue->status = MUSB_UNKNOWN;
|
||||
@ -389,6 +403,46 @@ static int omap2430_probe(struct platform_device *pdev)
|
||||
goto err2;
|
||||
}
|
||||
|
||||
if (populate_irqs) {
|
||||
struct resource musb_res[3];
|
||||
struct resource *res;
|
||||
int i = 0;
|
||||
|
||||
memset(musb_res, 0, sizeof(*musb_res) * ARRAY_SIZE(musb_res));
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (!res)
|
||||
goto err2;
|
||||
|
||||
musb_res[i].start = res->start;
|
||||
musb_res[i].end = res->end;
|
||||
musb_res[i].flags = res->flags;
|
||||
musb_res[i].name = res->name;
|
||||
i++;
|
||||
|
||||
ret = of_irq_get_byname(np, "mc");
|
||||
if (ret > 0) {
|
||||
musb_res[i].start = ret;
|
||||
musb_res[i].flags = IORESOURCE_IRQ;
|
||||
musb_res[i].name = "mc";
|
||||
i++;
|
||||
}
|
||||
|
||||
ret = of_irq_get_byname(np, "dma");
|
||||
if (ret > 0) {
|
||||
musb_res[i].start = ret;
|
||||
musb_res[i].flags = IORESOURCE_IRQ;
|
||||
musb_res[i].name = "dma";
|
||||
i++;
|
||||
}
|
||||
|
||||
ret = platform_device_add_resources(musb, musb_res, i);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to add IRQ resources\n");
|
||||
goto err2;
|
||||
}
|
||||
}
|
||||
|
||||
ret = platform_device_add_data(musb, pdata, sizeof(*pdata));
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to add platform_data\n");
|
||||
|
Loading…
Reference in New Issue
Block a user