usb: phy: phy-am335x: bypass first VBUS sensing for host-only mode
To prevent VBUS contention, the am335x MUSB phy senses VBUS first before transitioning to host mode. However, for host-only mode, VBUS could be directly tied to 5V power rail which could prevent MUSB transitions to host mode. This change receives dr_mode of the controller then bypass the first VBUS sensing for host-only mode, so that MUSB can work in host mode event if VBUS is tied to 5V. Signed-off-by: Bin Liu <b-liu@ti.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
This commit is contained in:
@@ -4,6 +4,7 @@
|
||||
#include <linux/of.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/usb/otg.h>
|
||||
#include "phy-am335x-control.h"
|
||||
|
||||
struct am335x_control_usb {
|
||||
@@ -58,7 +59,8 @@ static void am335x_phy_wkup(struct phy_control *phy_ctrl, u32 id, bool on)
|
||||
spin_unlock(&usb_ctrl->lock);
|
||||
}
|
||||
|
||||
static void am335x_phy_power(struct phy_control *phy_ctrl, u32 id, bool on)
|
||||
static void am335x_phy_power(struct phy_control *phy_ctrl, u32 id,
|
||||
enum usb_dr_mode dr_mode, bool on)
|
||||
{
|
||||
struct am335x_control_usb *usb_ctrl;
|
||||
u32 val;
|
||||
@@ -80,8 +82,14 @@ static void am335x_phy_power(struct phy_control *phy_ctrl, u32 id, bool on)
|
||||
|
||||
val = readl(usb_ctrl->phy_reg + reg);
|
||||
if (on) {
|
||||
val &= ~(USBPHY_CM_PWRDN | USBPHY_OTG_PWRDN);
|
||||
val |= USBPHY_OTGVDET_EN | USBPHY_OTGSESSEND_EN;
|
||||
if (dr_mode == USB_DR_MODE_HOST) {
|
||||
val &= ~(USBPHY_CM_PWRDN | USBPHY_OTG_PWRDN |
|
||||
USBPHY_OTGVDET_EN);
|
||||
val |= USBPHY_OTGSESSEND_EN;
|
||||
} else {
|
||||
val &= ~(USBPHY_CM_PWRDN | USBPHY_OTG_PWRDN);
|
||||
val |= USBPHY_OTGVDET_EN | USBPHY_OTGSESSEND_EN;
|
||||
}
|
||||
} else {
|
||||
val |= USBPHY_CM_PWRDN | USBPHY_OTG_PWRDN;
|
||||
}
|
||||
|
Reference in New Issue
Block a user