mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-30 08:02:30 +00:00
usb: musb: make Davinci *work* in mainline
Now that the musb build fixes for DaVinci got merged (RC3?), kick in the other bits needed to get it finally *working* in mainline: - Use clk_enable()/clk_disable() ... the "always enable USB clocks" code this originally relied on has since been removed. - Initialize the USB device only after the relevant I2C GPIOs are available, so the host side can properly enable VBUS. - Tweak init sequencing to cope with mainline's relatively late init of the I2C system bus for power switches, transceivers, and so on. Sanity tested on DM6664 EVM for host and peripheral modes; that system won't boot with CONFIG_PM enabled, so OTG can't yet be tested. Also verified on OMAP3. (Unrelated: correct the MODULE_PARM_DESC spelling of musb_debug.) Signed-off-by: David Brownell <dbrownell@users.sourceforge.net> Cc: Felipe Balbi <me@felipebalbi.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
67f5a4ba97
commit
34f32c9701
5 changed files with 17 additions and 18 deletions
|
@ -311,6 +311,9 @@ evm_u35_setup(struct i2c_client *client, int gpio, unsigned ngpio, void *c)
|
||||||
gpio_request(gpio + 7, "nCF_SEL");
|
gpio_request(gpio + 7, "nCF_SEL");
|
||||||
gpio_direction_output(gpio + 7, 1);
|
gpio_direction_output(gpio + 7, 1);
|
||||||
|
|
||||||
|
/* irlml6401 sustains over 3A, switches 5V in under 8 msec */
|
||||||
|
setup_usb(500, 8);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -417,9 +420,6 @@ static __init void davinci_evm_init(void)
|
||||||
platform_add_devices(davinci_evm_devices,
|
platform_add_devices(davinci_evm_devices,
|
||||||
ARRAY_SIZE(davinci_evm_devices));
|
ARRAY_SIZE(davinci_evm_devices));
|
||||||
evm_init_i2c();
|
evm_init_i2c();
|
||||||
|
|
||||||
/* irlml6401 sustains over 3A, switches 5V in under 8 msec */
|
|
||||||
setup_usb(500, 8);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static __init void davinci_evm_irq_init(void)
|
static __init void davinci_evm_irq_init(void)
|
||||||
|
|
|
@ -230,6 +230,11 @@ static struct clk davinci_clks[] = {
|
||||||
.rate = &commonrate,
|
.rate = &commonrate,
|
||||||
.lpsc = DAVINCI_LPSC_GPIO,
|
.lpsc = DAVINCI_LPSC_GPIO,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.name = "usb",
|
||||||
|
.rate = &commonrate,
|
||||||
|
.lpsc = DAVINCI_LPSC_USB,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.name = "AEMIFCLK",
|
.name = "AEMIFCLK",
|
||||||
.rate = &commonrate,
|
.rate = &commonrate,
|
||||||
|
|
|
@ -47,6 +47,7 @@ static struct musb_hdrc_platform_data usb_data = {
|
||||||
#elif defined(CONFIG_USB_MUSB_HOST)
|
#elif defined(CONFIG_USB_MUSB_HOST)
|
||||||
.mode = MUSB_HOST,
|
.mode = MUSB_HOST,
|
||||||
#endif
|
#endif
|
||||||
|
.clock = "usb",
|
||||||
.config = &musb_config,
|
.config = &musb_config,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -377,18 +377,8 @@ int __init musb_platform_init(struct musb *musb)
|
||||||
u32 revision;
|
u32 revision;
|
||||||
|
|
||||||
musb->mregs += DAVINCI_BASE_OFFSET;
|
musb->mregs += DAVINCI_BASE_OFFSET;
|
||||||
#if 0
|
|
||||||
/* REVISIT there's something odd about clocking, this
|
|
||||||
* didn't appear do the job ...
|
|
||||||
*/
|
|
||||||
musb->clock = clk_get(pDevice, "usb");
|
|
||||||
if (IS_ERR(musb->clock))
|
|
||||||
return PTR_ERR(musb->clock);
|
|
||||||
|
|
||||||
status = clk_enable(musb->clock);
|
clk_enable(musb->clock);
|
||||||
if (status < 0)
|
|
||||||
return -ENODEV;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* returns zero if e.g. not clocked */
|
/* returns zero if e.g. not clocked */
|
||||||
revision = musb_readl(tibase, DAVINCI_USB_VERSION_REG);
|
revision = musb_readl(tibase, DAVINCI_USB_VERSION_REG);
|
||||||
|
@ -453,5 +443,8 @@ int musb_platform_exit(struct musb *musb)
|
||||||
}
|
}
|
||||||
|
|
||||||
phy_off();
|
phy_off();
|
||||||
|
|
||||||
|
clk_disable(musb->clock);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -115,7 +115,7 @@
|
||||||
|
|
||||||
|
|
||||||
unsigned musb_debug;
|
unsigned musb_debug;
|
||||||
module_param(musb_debug, uint, S_IRUGO | S_IWUSR);
|
module_param_named(debug, musb_debug, uint, S_IRUGO | S_IWUSR);
|
||||||
MODULE_PARM_DESC(debug, "Debug message level. Default = 0");
|
MODULE_PARM_DESC(debug, "Debug message level. Default = 0");
|
||||||
|
|
||||||
#define DRIVER_AUTHOR "Mentor Graphics, Texas Instruments, Nokia"
|
#define DRIVER_AUTHOR "Mentor Graphics, Texas Instruments, Nokia"
|
||||||
|
@ -2243,10 +2243,10 @@ static int __init musb_init(void)
|
||||||
return platform_driver_probe(&musb_driver, musb_probe);
|
return platform_driver_probe(&musb_driver, musb_probe);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* make us init after usbcore and before usb
|
/* make us init after usbcore and i2c (transceivers, regulators, etc)
|
||||||
* gadget and host-side drivers start to register
|
* and before usb gadget and host-side drivers start to register
|
||||||
*/
|
*/
|
||||||
subsys_initcall(musb_init);
|
fs_initcall(musb_init);
|
||||||
|
|
||||||
static void __exit musb_cleanup(void)
|
static void __exit musb_cleanup(void)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue