musb: sunxi: Add set_mode platform function
PATCH v2 1/2 musb: sunxi: Add set_mode platform function
Move the mode handling to the platform_set_mode callback.
---
Changes in v2:
-No changes
--- drivers/usb/musb/sunxi.c | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-)
drivers/usb/musb/sunxi.c +19 -11
@@ -264,15 +264,6 @@ static int sunxi_musb_init(struct musb *musb)if (ret) 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;/* 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 ; -error_phy_exit: -phy_exit (glue->phy); error_unregister_notifier:if (musb->port_mode ==MUSB_PORT_MODE_DUAL_ROLE ) extcon_unregister_notifier(glue->extcon, EXTCON_USB_HOST,
@@ -323,6 +312,24 @@ static int sunxi_musb_exit(struct musb *musb)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) {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, .enable = sunxi_musb_enable, .disable = sunxi_musb_disable, + .set_mode = sunxi_set_mode, .fifo_offset = sunxi_musb_fifo_offset, .ep_offset = sunxi_musb_ep_offset, .busctl_offset = sunxi_musb_busctl_offset,
Signature · 1 line
2.7.4
PATCH v2 2/2 musb: sunxi: Set state to A_WAIT_VRISE when enabling Vbus
When the board is powering attached usb devices via the otg port sometimes / on some devices it takes slightly too long for the Vbus detection code in phy-sun4i-usb.c to signal that Vbus is high after enabling Vbus and the musb hardware signals a MUSB_INTR_VBUSERROR interrupt.
This commit sets the otg state to A_WAIT_VRISE upon enabling Vbus making musb_stage0_irq() ignore the first VBUSERR_RETRY_COUNT VBUSERROR interrupts, fixing connection issues in these cases.
---
Changes in v2:
-Use curly-braces in both branches of if-else
--- drivers/usb/musb/sunxi.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/usb/musb/sunxi.c +6 -3
@@ -112,7 +112,7 @@ static void sunxi_musb_work(struct work_struct *work)if (test_bit (SUNXI_MUSB_FL_HOSTMODE , &glue->flags)) {set_bit (SUNXI_MUSB_FL_VBUS_ON , &glue->flags); musb->xceiv->otg->default_a =1 ; - musb->xceiv->otg->state =OTG_STATE_A_IDLE ; + musb->xceiv->otg->state =OTG_STATE_A_WAIT_VRISE ;MUSB_HST_MODE (musb); devctl |=MUSB_DEVCTL_SESSION ; }else {
@@ -145,10 +145,12 @@ static void sunxi_musb_set_vbus(struct musb *musb, int is_on) {struct sunxi_glue *glue =dev_get_drvdata (musb->controller->parent); -if (is_on) +if (is_on) {set_bit (SUNXI_MUSB_FL_VBUS_ON , &glue->flags); -else + musb->xceiv->otg->state =OTG_STATE_A_WAIT_VRISE ; + }else {clear_bit (SUNXI_MUSB_FL_VBUS_ON , &glue->flags); + }schedule_work (&glue->work); }
@@ -325,6 +327,7 @@ static int sunxi_set_mode(struct musb *musb, u8 mode)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->xceiv->otg->state =OTG_STATE_A_WAIT_VRISE ; }return 0 ;
Signature · 1 line
2.7.4
Bin Liu
maintainerPATCH v2 1/2 musb: sunxi: Add set_mode platform function
Quoted 3 lines · Hans de Goede
Move the mode handling to the
platform_set_modecallback.Signed-off-by Hans de Goede <[email protected]>
Regards,
-Bin.
Bin Liu
maintainerPATCH v2 1/2 musb: sunxi: Add set_mode platform function
Hi,
Quoted 6 lines · Bin Liu
Quoted 3 lines · Hans de Goede
Move the mode handling to the
platform_set_modecallback.Signed-off-by Hans de Goede <[email protected]>Signed-off-by Bin Liu <[email protected]>
I revised the subject prefix to "usb: musb: sunxi: ..." for both patches.
Regards,
-Bin.
Quoted 3 lines
Regards,
-Bin.
Bin Liu
maintainerPATCH v2 2/2 musb: sunxi: Set state to A_WAIT_VRISE when enabling Vbus
In reply to Hans de GoedeQuoted 11 lines · Hans de Goede
When the board is powering attached usb devices via the otg port sometimes / on some devices it takes slightly too long for the Vbus detection code in
phy-sun4i-usb.cto signal that Vbus is high after enabling Vbus and the musb hardware signals aMUSB_INTR_VBUSERRORinterrupt.This commit sets the otg state to
A_WAIT_VRISEupon enabling Vbus makingmusb_stage0_irq()ignore the firstVBUSERR_RETRY_COUNTVBUSERROR interrupts, fixing connection issues in these cases.Signed-off-by Hans de Goede <[email protected]>
Regards,
-Bin.