• Sebastian Andrzej Siewior's avatar
    usb: musb: gadget: fix error path · 6193d699
    Sebastian Andrzej Siewior authored
    In case one "forgot" to load the receiver i.e. doing
    |modprobe omap2430
    |modprobe musb_hdrc
    
    he ends up with:
    
    |musb-hdrc: version 6.0, ?dma?, otg (peripheral+host)
    |HS USB OTG: no transceiver configured
    |musb-hdrc musb-hdrc: musb_init_controller failed with status -19
    |(NULL device *): gadget not registered.
    |Unable to handle kernel NULL pointer dereference at virtual address 0000001c
    |Internal error: Oops: 17 [#1] SMP
    |[<c011383c>] (sysfs_find_dirent+0x4/0x60) from [<c01138c0>] (sysfs_get_dirent+0x28/0x78)
    |[<c01138c0>] (sysfs_get_dirent+0x28/0x78) from [<c0115b78>] (sysfs_unmerge_group+0x1c/0x90)
    |[<c0115b78>] (sysfs_unmerge_group+0x1c/0x90) from [<c0179ba4>] (dpm_sysfs_remove+0x14/0x3c)
    |[<c0179ba4>] (dpm_sysfs_remove+0x14/0x3c) from [<c01742f8>] (device_del+0x40/0x1b4)
    |[<c01742f8>] (device_del+0x40/0x1b4) from [<c0174478>] (device_unregister+0xc/0x18)
    |[<c0174478>] (device_unregister+0xc/0x18) from [<bf0489b4>] (musb_free+0x24/0x88 [musb_hdrc])
    |[<bf0489b4>] (musb_free+0x24/0x88 [musb_hdrc]) from [<bf057d18>] (musb_probe+0xb50/0xe3c [musb_hdrc])
    |[<bf057d18>] (musb_probe+0xb50/0xe3c [musb_hdrc]) from [<c01779c4>] (platform_drv_probe+0x1c/0x24)
    
    The problem is that musb_free() tries to figure out what was
    initializued and what wasn't and clean up only the initialized part.
    This works well for usb_del_gadget_udc() but device_unregister() can't
    deal with it. Therefore we rely on the fact the we always have a parent
    device and only then remove the device.
    I broke this in 0f91349b ("usb: gadget: convert all users to the new udc
    infrastructure")
    Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
    Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
    6193d699
musb_gadget.c 57.7 KB