|
@@ -264,15 +264,6 @@ static int sunxi_musb_init(struct musb *musb)
|
|
if (ret)
|
|
if (ret)
|
|
goto error_unregister_notifier;
|
|
goto error_unregister_notifier;
|
|
|
|
|
|
- if (musb->port_mode == MUSB_PORT_MODE_HOST) {
|
|
|
|
- ret = phy_power_on(glue->phy);
|
|
|
|
- if (ret)
|
|
|
|
- goto error_phy_exit;
|
|
|
|
- set_bit(SUNXI_MUSB_FL_PHY_ON, &glue->flags);
|
|
|
|
- /* Stop musb work from turning vbus off again */
|
|
|
|
- set_bit(SUNXI_MUSB_FL_VBUS_ON, &glue->flags);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
musb->isr = sunxi_musb_interrupt;
|
|
musb->isr = sunxi_musb_interrupt;
|
|
|
|
|
|
/* Stop the musb-core from doing runtime pm (not supported on sunxi) */
|
|
/* Stop the musb-core from doing runtime pm (not supported on sunxi) */
|
|
@@ -280,8 +271,6 @@ static int sunxi_musb_init(struct musb *musb)
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
-error_phy_exit:
|
|
|
|
- phy_exit(glue->phy);
|
|
|
|
error_unregister_notifier:
|
|
error_unregister_notifier:
|
|
if (musb->port_mode == MUSB_PORT_MODE_DUAL_ROLE)
|
|
if (musb->port_mode == MUSB_PORT_MODE_DUAL_ROLE)
|
|
extcon_unregister_notifier(glue->extcon, EXTCON_USB_HOST,
|
|
extcon_unregister_notifier(glue->extcon, EXTCON_USB_HOST,
|
|
@@ -323,6 +312,24 @@ static int sunxi_musb_exit(struct musb *musb)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int sunxi_set_mode(struct musb *musb, u8 mode)
|
|
|
|
+{
|
|
|
|
+ struct sunxi_glue *glue = dev_get_drvdata(musb->controller->parent);
|
|
|
|
+ int ret;
|
|
|
|
+
|
|
|
|
+ if (mode == MUSB_HOST) {
|
|
|
|
+ ret = phy_power_on(glue->phy);
|
|
|
|
+ if (ret)
|
|
|
|
+ return ret;
|
|
|
|
+
|
|
|
|
+ set_bit(SUNXI_MUSB_FL_PHY_ON, &glue->flags);
|
|
|
|
+ /* Stop musb work from turning vbus off again */
|
|
|
|
+ set_bit(SUNXI_MUSB_FL_VBUS_ON, &glue->flags);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
static void sunxi_musb_enable(struct musb *musb)
|
|
static void sunxi_musb_enable(struct musb *musb)
|
|
{
|
|
{
|
|
struct sunxi_glue *glue = dev_get_drvdata(musb->controller->parent);
|
|
struct sunxi_glue *glue = dev_get_drvdata(musb->controller->parent);
|
|
@@ -569,6 +576,7 @@ static const struct musb_platform_ops sunxi_musb_ops = {
|
|
.exit = sunxi_musb_exit,
|
|
.exit = sunxi_musb_exit,
|
|
.enable = sunxi_musb_enable,
|
|
.enable = sunxi_musb_enable,
|
|
.disable = sunxi_musb_disable,
|
|
.disable = sunxi_musb_disable,
|
|
|
|
+ .set_mode = sunxi_set_mode,
|
|
.fifo_offset = sunxi_musb_fifo_offset,
|
|
.fifo_offset = sunxi_musb_fifo_offset,
|
|
.ep_offset = sunxi_musb_ep_offset,
|
|
.ep_offset = sunxi_musb_ep_offset,
|
|
.busctl_offset = sunxi_musb_busctl_offset,
|
|
.busctl_offset = sunxi_musb_busctl_offset,
|