USB: musb: blackfin: pm: make it work
Split the USB MMR init steps out into a helper func that both the platform init and the resume code may call. Then while suspending, the gpio_vrsel will change from high to low which will generate a wakeup event and resume the system immediately, so we need to manually drive it low before we sleep. Signed-off-by: Bob Liu <lliubbo@gmail.com> Signed-off-by: Mike Frysinger <vapier@gentoo.org> Signed-off-by: Felipe Balbi <balbi@ti.com>
This commit is contained in:
parent
32d5dc9520
commit
1e393c6eec
@ -323,30 +323,8 @@ int musb_platform_set_mode(struct musb *musb, u8 musb_mode)
|
|||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
int __init musb_platform_init(struct musb *musb, void *board_data)
|
static void musb_platform_reg_init(struct musb *musb)
|
||||||
{
|
{
|
||||||
|
|
||||||
/*
|
|
||||||
* Rev 1.0 BF549 EZ-KITs require PE7 to be high for both DEVICE
|
|
||||||
* and OTG HOST modes, while rev 1.1 and greater require PE7 to
|
|
||||||
* be low for DEVICE mode and high for HOST mode. We set it high
|
|
||||||
* here because we are in host mode
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (gpio_request(musb->config->gpio_vrsel, "USB_VRSEL")) {
|
|
||||||
printk(KERN_ERR "Failed ro request USB_VRSEL GPIO_%d \n",
|
|
||||||
musb->config->gpio_vrsel);
|
|
||||||
return -ENODEV;
|
|
||||||
}
|
|
||||||
gpio_direction_output(musb->config->gpio_vrsel, 0);
|
|
||||||
|
|
||||||
usb_nop_xceiv_register();
|
|
||||||
musb->xceiv = otg_get_transceiver();
|
|
||||||
if (!musb->xceiv) {
|
|
||||||
gpio_free(musb->config->gpio_vrsel);
|
|
||||||
return -ENODEV;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ANOMALY_05000346) {
|
if (ANOMALY_05000346) {
|
||||||
bfin_write_USB_APHY_CALIB(ANOMALY_05000346_value);
|
bfin_write_USB_APHY_CALIB(ANOMALY_05000346_value);
|
||||||
SSYNC();
|
SSYNC();
|
||||||
@ -380,6 +358,33 @@ int __init musb_platform_init(struct musb *musb, void *board_data)
|
|||||||
EP2_RX_ENA | EP3_RX_ENA | EP4_RX_ENA |
|
EP2_RX_ENA | EP3_RX_ENA | EP4_RX_ENA |
|
||||||
EP5_RX_ENA | EP6_RX_ENA | EP7_RX_ENA);
|
EP5_RX_ENA | EP6_RX_ENA | EP7_RX_ENA);
|
||||||
SSYNC();
|
SSYNC();
|
||||||
|
}
|
||||||
|
|
||||||
|
int __init musb_platform_init(struct musb *musb, void *board_data)
|
||||||
|
{
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Rev 1.0 BF549 EZ-KITs require PE7 to be high for both DEVICE
|
||||||
|
* and OTG HOST modes, while rev 1.1 and greater require PE7 to
|
||||||
|
* be low for DEVICE mode and high for HOST mode. We set it high
|
||||||
|
* here because we are in host mode
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (gpio_request(musb->config->gpio_vrsel, "USB_VRSEL")) {
|
||||||
|
printk(KERN_ERR "Failed ro request USB_VRSEL GPIO_%d\n",
|
||||||
|
musb->config->gpio_vrsel);
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
gpio_direction_output(musb->config->gpio_vrsel, 0);
|
||||||
|
|
||||||
|
usb_nop_xceiv_register();
|
||||||
|
musb->xceiv = otg_get_transceiver();
|
||||||
|
if (!musb->xceiv) {
|
||||||
|
gpio_free(musb->config->gpio_vrsel);
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
musb_platform_reg_init(musb);
|
||||||
|
|
||||||
if (is_host_enabled(musb)) {
|
if (is_host_enabled(musb)) {
|
||||||
musb->board_set_vbus = bfin_set_vbus;
|
musb->board_set_vbus = bfin_set_vbus;
|
||||||
@ -394,6 +399,27 @@ int __init musb_platform_init(struct musb *musb, void *board_data)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_PM
|
||||||
|
void musb_platform_save_context(struct musb *musb,
|
||||||
|
struct musb_context_registers *musb_context)
|
||||||
|
{
|
||||||
|
if (is_host_active(musb))
|
||||||
|
/*
|
||||||
|
* During hibernate gpio_vrsel will change from high to low
|
||||||
|
* low which will generate wakeup event resume the system
|
||||||
|
* immediately. Set it to 0 before hibernate to avoid this
|
||||||
|
* wakeup event.
|
||||||
|
*/
|
||||||
|
gpio_set_value(musb->config->gpio_vrsel, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void musb_platform_restore_context(struct musb *musb,
|
||||||
|
struct musb_context_registers *musb_context)
|
||||||
|
{
|
||||||
|
musb_platform_reg_init(musb);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
int musb_platform_exit(struct musb *musb)
|
int musb_platform_exit(struct musb *musb)
|
||||||
{
|
{
|
||||||
gpio_free(musb->config->gpio_vrsel);
|
gpio_free(musb->config->gpio_vrsel);
|
||||||
|
@ -487,7 +487,7 @@ struct musb_context_registers {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#if defined(CONFIG_ARCH_OMAP2430) || defined(CONFIG_ARCH_OMAP3) || \
|
#if defined(CONFIG_ARCH_OMAP2430) || defined(CONFIG_ARCH_OMAP3) || \
|
||||||
defined(CONFIG_ARCH_OMAP4)
|
defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_BLACKFIN)
|
||||||
extern void musb_platform_save_context(struct musb *musb,
|
extern void musb_platform_save_context(struct musb *musb,
|
||||||
struct musb_context_registers *musb_context);
|
struct musb_context_registers *musb_context);
|
||||||
extern void musb_platform_restore_context(struct musb *musb,
|
extern void musb_platform_restore_context(struct musb *musb,
|
||||||
|
Loading…
Reference in New Issue
Block a user