Hi,

On Sun, Feb 24, 2013 at 12:06:35AM +0100, Robert Jarzmik wrote:
> Hi Felipe,
> 
> I tried today's version of linux-next tree (commit id
> b1714a88bee1ae, "Add linux-next specific files for 20130222").
> 
> My PXA based platform bugs on bootup. I have no console available on my
> platform, just a JTAG, so this is the info I have :
>  - I'm using a Mitac MIO A701 board (arch/arm/mach-pxa/mioa701.c)
>  - on gadget side, I'm using g_ether + pxa27x_udc
> 
> So far, I didn't have any composite driver enabled (as the PXA suffer from a
> severe hardware defect, see comment in header of pxa27x_udc.c).
> 
> Now, what I gathered from the JTAG is in [1].
> You can see that in sysfs_create_file(), the first argument has :
> &dev->kobj->sd == NULL.
> 
> And of course in fs/sysfs/file.c :
>       BUG_ON(!kobj || !kobj->sd || !attr);
> 
> Therefore, I hit a BUG.
> 
> Could you tell me what changed recently that triggers this ? I saw in my 
> .config
> CONFIG_USB_LIBCOMPOSITE=y which looks a bit suspect to me, but I'm sure you'll
> tell me what recent change prevents my platform from booting.

this is not caused by current pull request. Well, you could argue that
commit 70189a63d408d4ea0cddbf0ff0afe6020844e813 (usb: gadget:
pxa27x_udc: convert to udc_start/udc_stop) is the culprit, but the fact
is that what pxa27x is doing is pretty wrong.

The bug is that pxa27x_udc tries to register gadget->dev at udc_start()
time and that's only called after gadget driver has already been bound
to the controller. Since commit above converted pxa27x to
udc_start()/udc_stop() calls, it exposed the issue.

Anyway, this patch should fix it (I didn't even compile test it, since
pxa27x still depends on its architecture, which needs to be fixed).

commit de7dedf26d906e3a2d6bf60385f8a55b9938ae16
Author: Felipe Balbi <ba...@ti.com>
Date:   Mon Feb 25 08:49:05 2013 +0200

    usb: gadget: pxa27x: fix gadget->dev registration
    
    Whenever ->udc_start() gets called, gadet driver
    has already being bound to the udc controller, which
    means that gadget->dev had to be already initialized
    and added to driver model.
    
    This patch fixes pxa27x mistake.
    
    Signed-off-by: Felipe Balbi <ba...@ti.com>

diff --git a/drivers/usb/gadget/pxa27x_udc.c b/drivers/usb/gadget/pxa27x_udc.c
index 2b3b01d..8f39db2 100644
--- a/drivers/usb/gadget/pxa27x_udc.c
+++ b/drivers/usb/gadget/pxa27x_udc.c
@@ -1821,11 +1821,6 @@ static int pxa27x_udc_start(struct usb_gadget_driver 
*driver,
        udc->gadget.dev.driver = &driver->driver;
        dplus_pullup(udc, 1);
 
-       retval = device_add(&udc->gadget.dev);
-       if (retval) {
-               dev_err(udc->dev, "device_add error %d\n", retval);
-               goto add_fail;
-       }
        retval = bind(&udc->gadget, driver);
        if (retval) {
                dev_err(udc->dev, "bind to driver %s --> error %d\n",
@@ -1852,8 +1847,6 @@ transceiver_fail:
        if (driver->unbind)
                driver->unbind(&udc->gadget);
 bind_fail:
-       device_del(&udc->gadget.dev);
-add_fail:
        udc->driver = NULL;
        udc->gadget.dev.driver = NULL;
        return retval;
@@ -1905,7 +1898,6 @@ static int pxa27x_udc_stop(struct usb_gadget_driver 
*driver)
        driver->unbind(&udc->gadget);
        udc->driver = NULL;
 
-       device_del(&udc->gadget.dev);
        dev_info(udc->dev, "unregistered gadget driver '%s'\n",
                 driver->driver.name);
 
@@ -2511,13 +2503,24 @@ static int __init pxa_udc_probe(struct platform_device 
*pdev)
                        driver_name, udc->irq, retval);
                goto err_irq;
        }
+
+       retval = device_add(&udc->gadget.dev);
+       if (retval) {
+               dev_err(udc->dev, "device_add error %d\n", retval);
+               goto err_dev_add;
+       }
+
        retval = usb_add_gadget_udc(&pdev->dev, &udc->gadget);
        if (retval)
                goto err_add_udc;
 
        pxa_init_debugfs(udc);
+
        return 0;
+
 err_add_udc:
+       device_unregister(&udc->gadget.dev);
+err_dev_add:
        free_irq(udc->irq, udc);
 err_irq:
        iounmap(udc->regs);
@@ -2538,6 +2541,7 @@ static int __exit pxa_udc_remove(struct platform_device 
*_dev)
        int gpio = udc->mach->gpio_pullup;
 
        usb_del_gadget_udc(&udc->gadget);
+       device_del(&udc->gadget.dev);
        usb_gadget_unregister_driver(udc->driver);
        free_irq(udc->irq, udc);
        pxa_cleanup_debugfs(udc);

-- 
balbi

Attachment: signature.asc
Description: Digital signature

Reply via email to