Subject: [RESEND PATCH v3 2/4] usb: musb: Bugfix of_node assignment

From: [email-masked] (Sebastian Andrzej Siewior)
Date: Mon, 25 Nov 2013 17:48:54 +0100

On 11/25/2013 05:14 PM, Felipe Balbi wrote:
> Hi,
> 
> On Mon, Nov 18, 2013 at 04:54:36PM +0100, Markus Pargmann wrote:
>> It is not safe to assign the of_node to a device without driver.
>> The device is matched against a list of drivers and the of_node
>> could lead to a DT match with the parent driver.
>> 
>> Signed-off-by: Markus Pargmann <[email-masked]> --- 
>> drivers/usb/musb/musb_core.c | 12 +++++++++++- 
>> drivers/usb/musb/musb_dsps.c |  1 - 2 files changed, 11
>> insertions(+), 2 deletions(-)
>> 
>> diff --git a/drivers/usb/musb/musb_core.c
>> b/drivers/usb/musb/musb_core.c index 8b7d903..d5ad9db 100644 ---
>> a/drivers/usb/musb/musb_core.c +++
>> b/drivers/usb/musb/musb_core.c @@ -1966,6 +1966,7 @@ static int
>> musb_probe(struct platform_device *pdev) int		irq =
>> platform_get_irq_byname(pdev, "mc"); struct resource	*iomem; void
>> __iomem	*base; +	int ret;
>> 
>> iomem = platform_get_resource(pdev, IORESOURCE_MEM, 0); if
>> (!iomem || irq <= 0) @@ -1975,7 +1976,16 @@ static int
>> musb_probe(struct platform_device *pdev) if (IS_ERR(base)) return
>> PTR_ERR(base);
>> 
>> -	return musb_init_controller(dev, irq, base); +	if
>> (dev->parent)

don't we always have a parent?

>> +		dev->of_node = dev->parent->of_node; + +	ret =
>> musb_init_controller(dev, irq, base); +	if (ret) { +
>> dev->of_node = NULL; +		return ret; +	} + +	return 0; }
>> 
>> static int musb_remove(struct platform_device *pdev) diff --git
>> a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c 
>> index 82e1da0..7b36d32 100644 --- a/drivers/usb/musb/musb_dsps.c 
>> +++ b/drivers/usb/musb/musb_dsps.c @@ -485,7 +485,6 @@ static int
>> dsps_create_musb_pdev(struct dsps_glue *glue, musb->dev.parent		=
>> dev; musb->dev.dma_mask		= &musb_dmamask; 
>> musb->dev.coherent_dma_mask	= musb_dmamask; -	musb->dev.of_node
>> = of_node_get(dn);
> 
> Sebastian, does this look correct to you ?

Is this fixing a bug? Commit 4fc4b2 ("usb: musb: dsps: do not bind to
"musb-hdrc") [0] should fix the problem that is described here.
ux500 is affected by the same problem as dsps but it is only visible on
dsps because we DEFER probe for few reasons there test the fail path.

So by just looking at it should fix the same problem as the change I
cited _but_ it would also cover ux500. Currently I can't think of any
side effects by assigning of_node if the musb_init_*() did not do it.
If we take this in I would suggest to remove the check I added (because
it does no longer serve any purpose) and the description (why we do
this, what is the problem exactly) is could be taken from my patch
since I think it is better described (it safe to assign a node to a
driver, it becomes unsafe if after platform_probe _also_ the DT probe
is executed which was not to designed to work like this).

In the long term I would suggest to move the DT probe over to the musb
core code and we wouldn't need the node assignment anymore?

[0] http://www.spinics.net/lists/linux-usb/msg94701.html

Sebastian