usb: musb: Get rid of omap2430_musb_set_vbus()

Now that we've removed direct calls from interrupt handler to
omap2430_musb_set_vbus(), let's make things less confusing and
configure VBUS directly in omap_musb_set_mailbox().

We have omap_musb_set_mailbox() called from the PHYs, and that's
all we need.

Note that we can now also drop the check for MUSB_INTERFACE_UTMI,
we've been already calling otg_set_vbus(musb->xceiv->otg, 0)
unconditionally via omap2430_musb_set_vbus() and we should only
need to call it once.

And we want to disable VBUS unconditionally on disconnect even
without musb->gadget_driver, so let's drop that check too.

Acked-by: Pavel Machek <pavel@ucw.cz>
Signed-off-by: Tony Lindgren <tony@atomide.com>
Signed-off-by: Bin Liu <b-liu@ti.com>
Link: https://lore.kernel.org/r/20200115132547.364-11-b-liu@ti.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Tony Lindgren 2020-01-15 07:25:32 -06:00 committed by Greg Kroah-Hartman
parent 8b359cbc3c
commit 98827105d8

View File

@ -38,42 +38,6 @@ struct omap2430_glue {
static struct omap2430_glue *_glue; static struct omap2430_glue *_glue;
/*
* HDRC controls CPEN, but beware current surges during device connect.
* They can trigger transient overcurrent conditions that must be ignored.
*
* Note that we're skipping A_WAIT_VFALL -> A_IDLE and jumping right to B_IDLE
* as set by musb_set_peripheral().
*/
static void omap2430_musb_set_vbus(struct musb *musb, int is_on)
{
struct usb_otg *otg = musb->xceiv->otg;
int error;
if (is_on) {
switch (musb->xceiv->otg->state) {
case OTG_STATE_A_IDLE:
error = musb_set_host(musb);
if (!error) {
musb->xceiv->otg->state =
OTG_STATE_A_WAIT_VRISE;
otg_set_vbus(otg, 1);
}
break;
default:
otg_set_vbus(otg, 1);
break;
}
} else {
error = musb_set_peripheral(musb);
otg_set_vbus(otg, 0);
}
dev_dbg(musb->controller, "VBUS %s, devctl %02x\n",
usb_otg_state_string(musb->xceiv->otg->state),
musb_readb(musb->mregs, MUSB_DEVCTL));
}
static inline void omap2430_low_level_exit(struct musb *musb) static inline void omap2430_low_level_exit(struct musb *musb)
{ {
u32 l; u32 l;
@ -113,27 +77,42 @@ static int omap2430_musb_mailbox(enum musb_vbus_id_status status)
return 0; return 0;
} }
/*
* HDRC controls CPEN, but beware current surges during device connect.
* They can trigger transient overcurrent conditions that must be ignored.
*
* Note that we're skipping A_WAIT_VFALL -> A_IDLE and jumping right to B_IDLE
* as set by musb_set_peripheral().
*/
static void omap_musb_set_mailbox(struct omap2430_glue *glue) static void omap_musb_set_mailbox(struct omap2430_glue *glue)
{ {
struct musb *musb = glue_to_musb(glue); struct musb *musb = glue_to_musb(glue);
struct musb_hdrc_platform_data *pdata = int error;
dev_get_platdata(musb->controller);
struct omap_musb_board_data *data = pdata->board_data;
pm_runtime_get_sync(musb->controller); pm_runtime_get_sync(musb->controller);
dev_dbg(musb->controller, "VBUS %s, devctl %02x\n",
usb_otg_state_string(musb->xceiv->otg->state),
musb_readb(musb->mregs, MUSB_DEVCTL));
switch (glue->status) { switch (glue->status) {
case MUSB_ID_GROUND: case MUSB_ID_GROUND:
dev_dbg(musb->controller, "ID GND\n"); dev_dbg(musb->controller, "ID GND\n");
switch (musb->xceiv->otg->state) { switch (musb->xceiv->otg->state) {
case OTG_STATE_A_IDLE:
error = musb_set_host(musb);
if (error)
break;
musb->xceiv->otg->state = OTG_STATE_A_WAIT_VRISE;
/* Fall through */
case OTG_STATE_A_WAIT_VRISE: case OTG_STATE_A_WAIT_VRISE:
case OTG_STATE_A_WAIT_BCON: case OTG_STATE_A_WAIT_BCON:
case OTG_STATE_A_HOST: case OTG_STATE_A_HOST:
case OTG_STATE_A_IDLE:
/* /*
* On multiple ID ground interrupts just keep enabling * On multiple ID ground interrupts just keep enabling
* VBUS. At least cpcap VBUS shuts down otherwise. * VBUS. At least cpcap VBUS shuts down otherwise.
*/ */
omap2430_musb_set_vbus(musb, 1); otg_set_vbus(musb->xceiv->otg, 1);
break; break;
default: default:
musb->xceiv->otg->state = OTG_STATE_A_IDLE; musb->xceiv->otg->state = OTG_STATE_A_IDLE;
@ -141,7 +120,7 @@ static void omap_musb_set_mailbox(struct omap2430_glue *glue)
if (musb->gadget_driver) { if (musb->gadget_driver) {
omap_control_usb_set_mode(glue->control_otghs, omap_control_usb_set_mode(glue->control_otghs,
USB_MODE_HOST); USB_MODE_HOST);
omap2430_musb_set_vbus(musb, 1); otg_set_vbus(musb->xceiv->otg, 1);
} }
break; break;
} }
@ -160,12 +139,8 @@ static void omap_musb_set_mailbox(struct omap2430_glue *glue)
dev_dbg(musb->controller, "VBUS Disconnect\n"); dev_dbg(musb->controller, "VBUS Disconnect\n");
musb->xceiv->last_event = USB_EVENT_NONE; musb->xceiv->last_event = USB_EVENT_NONE;
if (musb->gadget_driver) musb_set_peripheral(musb);
omap2430_musb_set_vbus(musb, 0); otg_set_vbus(musb->xceiv->otg, 0);
if (data->interface_type == MUSB_INTERFACE_UTMI)
otg_set_vbus(musb->xceiv->otg, 0);
omap_control_usb_set_mode(glue->control_otghs, omap_control_usb_set_mode(glue->control_otghs,
USB_MODE_DISCONNECT); USB_MODE_DISCONNECT);
break; break;