Commit 6a867cef authored by Ming Lei's avatar Ming Lei Committed by Greg Kroah-Hartman

usb: musb: fix dependency on transceiver driver

commit 25736e0c upstream.

This patch let glue driver return -EPROBE_DEFER if the transceiver
is not readly, so we can support defer probe on musb to fix the
below error on 3.7-rc5 if transceiver drivers are built as module:

[   19.052490] unable to find transceiver of type USB2 PHY
[   19.072052] HS USB OTG: no transceiver configured
[   19.076995] musb-hdrc musb-hdrc.0.auto: musb_init_controller failed with status -19
[   19.089355] musb-hdrc: probe of musb-hdrc.0.auto rejects match -19
[   19.096771] driver: 'musb-omap2430': driver_bound: bound to device 'musb-omap2430'
[   19.105194] bus: 'platform': really_probe: bound device musb-omap2430 to driver musb-omap2430
[   19.174407] bus: 'platform': add driver twl4030_usb
[   19.179656] bus: 'platform': driver_probe_device: matched device twl4030_usb with driver twl4030_usb
[   19.202270] bus: 'platform': really_probe: probing driver twl4030_usb with device twl4030_usb
[   19.214172] twl4030_usb twl4030_usb: HW_CONDITIONS 0xc0/192; link 3
[   19.239624] musb-omap2430 musb-omap2430: musb core is not yet ready
[   19.246765] twl4030_usb twl4030_usb: Initialized TWL4030 USB module
[   19.254516] driver: 'twl4030_usb': driver_bound: bound to device 'twl4030_usb'
[   19.263580] bus: 'platform': really_probe: bound device twl4030_usb to driver twl4030_usb

Cc: Sebastian Andrzej Siewior <sebastian@breakpoint.cc>
Signed-off-by: default avatarMing Lei <ming.lei@canonical.com>
Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 0452c262
...@@ -365,7 +365,7 @@ static int am35x_musb_init(struct musb *musb) ...@@ -365,7 +365,7 @@ static int am35x_musb_init(struct musb *musb)
usb_nop_xceiv_register(); usb_nop_xceiv_register();
musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2); musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2);
if (IS_ERR_OR_NULL(musb->xceiv)) if (IS_ERR_OR_NULL(musb->xceiv))
return -ENODEV; return -EPROBE_DEFER;
setup_timer(&otg_workaround, otg_timer, (unsigned long) musb); setup_timer(&otg_workaround, otg_timer, (unsigned long) musb);
......
...@@ -406,7 +406,7 @@ static int bfin_musb_init(struct musb *musb) ...@@ -406,7 +406,7 @@ static int bfin_musb_init(struct musb *musb)
musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2); musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2);
if (IS_ERR_OR_NULL(musb->xceiv)) { if (IS_ERR_OR_NULL(musb->xceiv)) {
gpio_free(musb->config->gpio_vrsel); gpio_free(musb->config->gpio_vrsel);
return -ENODEV; return -EPROBE_DEFER;
} }
bfin_musb_reg_init(musb); bfin_musb_reg_init(musb);
......
...@@ -410,6 +410,7 @@ static int da8xx_musb_init(struct musb *musb) ...@@ -410,6 +410,7 @@ static int da8xx_musb_init(struct musb *musb)
{ {
void __iomem *reg_base = musb->ctrl_base; void __iomem *reg_base = musb->ctrl_base;
u32 rev; u32 rev;
int ret = -ENODEV;
musb->mregs += DA8XX_MENTOR_CORE_OFFSET; musb->mregs += DA8XX_MENTOR_CORE_OFFSET;
...@@ -420,8 +421,10 @@ static int da8xx_musb_init(struct musb *musb) ...@@ -420,8 +421,10 @@ static int da8xx_musb_init(struct musb *musb)
usb_nop_xceiv_register(); usb_nop_xceiv_register();
musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2); musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2);
if (IS_ERR_OR_NULL(musb->xceiv)) if (IS_ERR_OR_NULL(musb->xceiv)) {
ret = -EPROBE_DEFER;
goto fail; goto fail;
}
setup_timer(&otg_workaround, otg_timer, (unsigned long)musb); setup_timer(&otg_workaround, otg_timer, (unsigned long)musb);
...@@ -441,7 +444,7 @@ static int da8xx_musb_init(struct musb *musb) ...@@ -441,7 +444,7 @@ static int da8xx_musb_init(struct musb *musb)
musb->isr = da8xx_musb_interrupt; musb->isr = da8xx_musb_interrupt;
return 0; return 0;
fail: fail:
return -ENODEV; return ret;
} }
static int da8xx_musb_exit(struct musb *musb) static int da8xx_musb_exit(struct musb *musb)
......
...@@ -380,11 +380,14 @@ static int davinci_musb_init(struct musb *musb) ...@@ -380,11 +380,14 @@ static int davinci_musb_init(struct musb *musb)
{ {
void __iomem *tibase = musb->ctrl_base; void __iomem *tibase = musb->ctrl_base;
u32 revision; u32 revision;
int ret = -ENODEV;
usb_nop_xceiv_register(); usb_nop_xceiv_register();
musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2); musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2);
if (IS_ERR_OR_NULL(musb->xceiv)) if (IS_ERR_OR_NULL(musb->xceiv)) {
ret = -EPROBE_DEFER;
goto unregister; goto unregister;
}
musb->mregs += DAVINCI_BASE_OFFSET; musb->mregs += DAVINCI_BASE_OFFSET;
...@@ -438,7 +441,7 @@ static int davinci_musb_init(struct musb *musb) ...@@ -438,7 +441,7 @@ static int davinci_musb_init(struct musb *musb)
usb_put_phy(musb->xceiv); usb_put_phy(musb->xceiv);
unregister: unregister:
usb_nop_xceiv_unregister(); usb_nop_xceiv_unregister();
return -ENODEV; return ret;
} }
static int davinci_musb_exit(struct musb *musb) static int davinci_musb_exit(struct musb *musb)
......
...@@ -419,7 +419,7 @@ static int dsps_musb_init(struct musb *musb) ...@@ -419,7 +419,7 @@ static int dsps_musb_init(struct musb *musb)
usb_nop_xceiv_register(); usb_nop_xceiv_register();
musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2); musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2);
if (IS_ERR_OR_NULL(musb->xceiv)) if (IS_ERR_OR_NULL(musb->xceiv))
return -ENODEV; return -EPROBE_DEFER;
/* Returns zero if e.g. not clocked */ /* Returns zero if e.g. not clocked */
rev = dsps_readl(reg_base, wrp->revision); rev = dsps_readl(reg_base, wrp->revision);
......
...@@ -369,7 +369,7 @@ static int omap2430_musb_init(struct musb *musb) ...@@ -369,7 +369,7 @@ static int omap2430_musb_init(struct musb *musb)
musb->xceiv = devm_usb_get_phy(dev, USB_PHY_TYPE_USB2); musb->xceiv = devm_usb_get_phy(dev, USB_PHY_TYPE_USB2);
if (IS_ERR_OR_NULL(musb->xceiv)) { if (IS_ERR_OR_NULL(musb->xceiv)) {
pr_err("HS USB OTG: no transceiver configured\n"); pr_err("HS USB OTG: no transceiver configured\n");
return -ENODEV; return -EPROBE_DEFER;
} }
musb->isr = omap2430_musb_interrupt; musb->isr = omap2430_musb_interrupt;
......
...@@ -1069,7 +1069,7 @@ static int tusb_musb_init(struct musb *musb) ...@@ -1069,7 +1069,7 @@ static int tusb_musb_init(struct musb *musb)
usb_nop_xceiv_register(); usb_nop_xceiv_register();
musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2); musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2);
if (IS_ERR_OR_NULL(musb->xceiv)) if (IS_ERR_OR_NULL(musb->xceiv))
return -ENODEV; return -EPROBE_DEFER;
pdev = to_platform_device(musb->controller); pdev = to_platform_device(musb->controller);
......
...@@ -61,7 +61,7 @@ static int ux500_musb_init(struct musb *musb) ...@@ -61,7 +61,7 @@ static int ux500_musb_init(struct musb *musb)
musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2); musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2);
if (IS_ERR_OR_NULL(musb->xceiv)) { if (IS_ERR_OR_NULL(musb->xceiv)) {
pr_err("HS USB OTG: no transceiver configured\n"); pr_err("HS USB OTG: no transceiver configured\n");
return -ENODEV; return -EPROBE_DEFER;
} }
musb->isr = ux500_musb_interrupt; musb->isr = ux500_musb_interrupt;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment