提交 65945917 编写于 作者: L Li Jun 提交者: Greg Kroah-Hartman

usb: chipidea: host: turn on vbus before add hcd if early vbus on is required

If CI_HDRC_TURN_VBUS_EARLY_ON is set, turn on vbus before adding hcd, so it
will not set reg_vbus of ehci_ci_priv, then vbus will not be handled by ehci core.
Signed-off-by: NLi Jun <jun.li@freescale.com>
Signed-off-by: NPeter Chen <peter.chen@freescale.com>
Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
上级 6adb9b7b
...@@ -44,11 +44,10 @@ static int ehci_ci_portpower(struct usb_hcd *hcd, int portnum, bool enable) ...@@ -44,11 +44,10 @@ static int ehci_ci_portpower(struct usb_hcd *hcd, int portnum, bool enable)
struct ehci_hcd *ehci = hcd_to_ehci(hcd); struct ehci_hcd *ehci = hcd_to_ehci(hcd);
struct ehci_ci_priv *priv = (struct ehci_ci_priv *)ehci->priv; struct ehci_ci_priv *priv = (struct ehci_ci_priv *)ehci->priv;
struct device *dev = hcd->self.controller; struct device *dev = hcd->self.controller;
struct ci_hdrc *ci = dev_get_drvdata(dev);
int ret = 0; int ret = 0;
int port = HCS_N_PORTS(ehci->hcs_params); int port = HCS_N_PORTS(ehci->hcs_params);
if (priv->reg_vbus && !ci_otg_is_fsm_mode(ci)) { if (priv->reg_vbus) {
if (port > 1) { if (port > 1) {
dev_warn(dev, dev_warn(dev,
"Not support multi-port regulator control\n"); "Not support multi-port regulator control\n");
...@@ -114,12 +113,23 @@ static int host_start(struct ci_hdrc *ci) ...@@ -114,12 +113,23 @@ static int host_start(struct ci_hdrc *ci)
priv = (struct ehci_ci_priv *)ehci->priv; priv = (struct ehci_ci_priv *)ehci->priv;
priv->reg_vbus = NULL; priv->reg_vbus = NULL;
if (ci->platdata->reg_vbus) if (ci->platdata->reg_vbus && !ci_otg_is_fsm_mode(ci)) {
priv->reg_vbus = ci->platdata->reg_vbus; if (ci->platdata->flags & CI_HDRC_TURN_VBUS_EARLY_ON) {
ret = regulator_enable(ci->platdata->reg_vbus);
if (ret) {
dev_err(ci->dev,
"Failed to enable vbus regulator, ret=%d\n",
ret);
goto put_hcd;
}
} else {
priv->reg_vbus = ci->platdata->reg_vbus;
}
}
ret = usb_add_hcd(hcd, 0, 0); ret = usb_add_hcd(hcd, 0, 0);
if (ret) { if (ret) {
goto put_hcd; goto disable_reg;
} else { } else {
struct usb_otg *otg = &ci->otg; struct usb_otg *otg = &ci->otg;
...@@ -139,6 +149,10 @@ static int host_start(struct ci_hdrc *ci) ...@@ -139,6 +149,10 @@ static int host_start(struct ci_hdrc *ci)
return ret; return ret;
disable_reg:
if (ci->platdata->reg_vbus && !ci_otg_is_fsm_mode(ci) &&
(ci->platdata->flags & CI_HDRC_TURN_VBUS_EARLY_ON))
regulator_disable(ci->platdata->reg_vbus);
put_hcd: put_hcd:
usb_put_hcd(hcd); usb_put_hcd(hcd);
...@@ -152,6 +166,9 @@ static void host_stop(struct ci_hdrc *ci) ...@@ -152,6 +166,9 @@ static void host_stop(struct ci_hdrc *ci)
if (hcd) { if (hcd) {
usb_remove_hcd(hcd); usb_remove_hcd(hcd);
usb_put_hcd(hcd); usb_put_hcd(hcd);
if (ci->platdata->reg_vbus && !ci_otg_is_fsm_mode(ci) &&
(ci->platdata->flags & CI_HDRC_TURN_VBUS_EARLY_ON))
regulator_disable(ci->platdata->reg_vbus);
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册