Currently pxa2xx_udc spits this warning: WARNING: at arch/arm/mach-pxa/clock.c:86 clk_disable+0x48/0xb0() Modules linked in: [<c001ea0c>] (dump_stack+0x0/0x14) from [<c002fe50>] (warn_on_slowpath+0x4c/0x60) [<c002fe04>] (warn_on_slowpath+0x0/0x60) from [<c00230d0>] (clk_disable+0x48/0xb0) r6:c02162fc r5:c02178f0 r4:f2600000 [<c0023088>] (clk_disable+0x0/0xb0) from [<c012d388>] (udc_disable+0x54/0x68) r5:c0222e08 r4:f2600000 [<c012d334>] (udc_disable+0x0/0x68) from [<c00133a8>] (pxa2xx_udc_probe+0x194/0x2c0) r5:c0216304 r4:c0222e08 [<c0013214>] (pxa2xx_udc_probe+0x0/0x2c0) from [<c011f318>] (platform_drv_probe+0x20/0x24) ...
This happens because udc_probe tries to disable clock that isn't yet enabled (udc_probe() calls udc_disable() to reinit hardware). That warning isn't a fluffy one. That is, on ARCH_PXA, pxa2xx_udc isn't functional without the patch below, because when clk_disable() called on the already disabled clock, this will turn clk->enabled to -1, and then clk_enable() will blank shot, see arch/arm/mach-pxa/clock.c: int clk_enable(struct clk *clk) { ... if (clk->enabled++ == 0) clk->ops->enable(clk); ... } Signed-off-by: Anton Vorontsov <[EMAIL PROTECTED]> --- drivers/usb/gadget/pxa2xx_udc.c | 13 +++++++------ 1 files changed, 7 insertions(+), 6 deletions(-) diff --git a/drivers/usb/gadget/pxa2xx_udc.c b/drivers/usb/gadget/pxa2xx_udc.c index 4402d6f..f2ba235 100644 --- a/drivers/usb/gadget/pxa2xx_udc.c +++ b/drivers/usb/gadget/pxa2xx_udc.c @@ -929,7 +929,7 @@ static int pxa2xx_udc_wakeup(struct usb_gadget *_gadget) static void stop_activity(struct pxa2xx_udc *, struct usb_gadget_driver *); static void udc_enable (struct pxa2xx_udc *); -static void udc_disable(struct pxa2xx_udc *); +static void udc_disable(struct pxa2xx_udc *, bool); /* We disable the UDC -- and its 48 MHz clock -- whenever it's not * in active use. @@ -947,7 +947,7 @@ static int pullup(struct pxa2xx_udc *udc, int is_active) : "(no driver)"); stop_activity(udc, udc->driver); } - udc_disable(udc); + udc_disable(udc, true); } return 0; } @@ -1134,7 +1134,7 @@ static const struct file_operations debug_fops = { /* * udc_disable - disable USB device controller */ -static void udc_disable(struct pxa2xx_udc *dev) +static void udc_disable(struct pxa2xx_udc *dev, bool enabled) { /* block all irqs */ udc_set_mask_UDCCR(UDCCR_SRM|UDCCR_REM); @@ -1148,7 +1148,8 @@ static void udc_disable(struct pxa2xx_udc *dev) #ifdef CONFIG_ARCH_PXA /* Disable clock for USB device */ - clk_disable(dev->clk); + if (enabled) + clk_disable(dev->clk); #endif ep0_idle (dev); @@ -2183,7 +2184,7 @@ static int __init pxa2xx_udc_probe(struct platform_device *pdev) the_controller = dev; platform_set_drvdata(pdev, dev); - udc_disable(dev); + udc_disable(dev, false); udc_reinit(dev); dev->vbus = is_vbus_present(); @@ -2269,7 +2270,7 @@ static int __exit pxa2xx_udc_remove(struct platform_device *pdev) if (dev->driver) return -EBUSY; - udc_disable(dev); + udc_disable(dev, true); remove_debug_files(dev); if (dev->got_irq) { -- 1.5.4.3 - 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