This commit is contained in:
@@ -83,9 +83,9 @@ static int do_fastboot_usb(int argc, char *const argv[],
|
|||||||
ret = CMD_RET_SUCCESS;
|
ret = CMD_RET_SUCCESS;
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
|
usb_gadget_release(controller_index);
|
||||||
g_dnl_unregister();
|
g_dnl_unregister();
|
||||||
g_dnl_clear_detach();
|
g_dnl_clear_detach();
|
||||||
usb_gadget_release(controller_index);
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
#else
|
#else
|
||||||
|
@@ -168,7 +168,7 @@ static void usb_hub_power_on(struct usb_hub_device *hub)
|
|||||||
int i;
|
int i;
|
||||||
struct usb_device *dev;
|
struct usb_device *dev;
|
||||||
unsigned pgood_delay = hub->desc.bPwrOn2PwrGood * 2;
|
unsigned pgood_delay = hub->desc.bPwrOn2PwrGood * 2;
|
||||||
const char *env;
|
const char __maybe_unused *env;
|
||||||
|
|
||||||
dev = hub->pusb_dev;
|
dev = hub->pusb_dev;
|
||||||
|
|
||||||
@@ -193,10 +193,12 @@ static void usb_hub_power_on(struct usb_hub_device *hub)
|
|||||||
* but allow this time to be increased via env variable as some
|
* but allow this time to be increased via env variable as some
|
||||||
* devices break the spec and require longer warm-up times
|
* devices break the spec and require longer warm-up times
|
||||||
*/
|
*/
|
||||||
|
#if CONFIG_IS_ENABLED(ENV_SUPPORT)
|
||||||
env = env_get("usb_pgood_delay");
|
env = env_get("usb_pgood_delay");
|
||||||
if (env)
|
if (env)
|
||||||
pgood_delay = max(pgood_delay,
|
pgood_delay = max(pgood_delay,
|
||||||
(unsigned)simple_strtol(env, NULL, 0));
|
(unsigned)simple_strtol(env, NULL, 0));
|
||||||
|
#endif
|
||||||
debug("pgood_delay=%dms\n", pgood_delay);
|
debug("pgood_delay=%dms\n", pgood_delay);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -455,6 +455,48 @@ int generic_phy_power_off_bulk(struct phy_bulk *bulk)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int generic_setup_phy(struct udevice *dev, struct phy *phy, int index)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
if (!phy)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
ret = generic_phy_get_by_index(dev, index, phy);
|
||||||
|
if (ret) {
|
||||||
|
if (ret != -ENOENT)
|
||||||
|
return ret;
|
||||||
|
} else {
|
||||||
|
ret = generic_phy_init(phy);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = generic_phy_power_on(phy);
|
||||||
|
if (ret)
|
||||||
|
ret = generic_phy_exit(phy);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int generic_shutdown_phy(struct phy *phy)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
if (!phy)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (generic_phy_valid(phy)) {
|
||||||
|
ret = generic_phy_power_off(phy);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = generic_phy_exit(phy);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
UCLASS_DRIVER(phy) = {
|
UCLASS_DRIVER(phy) = {
|
||||||
.id = UCLASS_PHY,
|
.id = UCLASS_PHY,
|
||||||
.name = "phy",
|
.name = "phy",
|
||||||
|
@@ -21,7 +21,6 @@ obj-$(CONFIG_USB_GADGET_DWC2_OTG) += dwc2_udc_otg.o
|
|||||||
obj-$(CONFIG_USB_GADGET_DWC2_OTG_PHY) += dwc2_udc_otg_phy.o
|
obj-$(CONFIG_USB_GADGET_DWC2_OTG_PHY) += dwc2_udc_otg_phy.o
|
||||||
obj-$(CONFIG_USB_GADGET_FOTG210) += fotg210.o
|
obj-$(CONFIG_USB_GADGET_FOTG210) += fotg210.o
|
||||||
obj-$(CONFIG_USB_GADGET_MAX3420) += max3420_udc.o
|
obj-$(CONFIG_USB_GADGET_MAX3420) += max3420_udc.o
|
||||||
obj-$(CONFIG_CI_UDC) += ci_udc.o
|
|
||||||
ifndef CONFIG_SPL_BUILD
|
ifndef CONFIG_SPL_BUILD
|
||||||
obj-$(CONFIG_USB_GADGET_DOWNLOAD) += g_dnl.o
|
obj-$(CONFIG_USB_GADGET_DOWNLOAD) += g_dnl.o
|
||||||
obj-$(CONFIG_USB_FUNCTION_THOR) += f_thor.o
|
obj-$(CONFIG_USB_FUNCTION_THOR) += f_thor.o
|
||||||
@@ -33,14 +32,12 @@ obj-$(CONFIG_USB_FUNCTION_ROCKUSB) += f_rockusb.o
|
|||||||
obj-$(CONFIG_USB_FUNCTION_ACM) += f_acm.o
|
obj-$(CONFIG_USB_FUNCTION_ACM) += f_acm.o
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
ifdef CONFIG_USB_ETHER
|
|
||||||
obj-y += ether.o
|
|
||||||
obj-$(CONFIG_USB_ETH_RNDIS) += rndis.o
|
|
||||||
obj-$(CONFIG_CI_UDC) += ci_udc.o
|
obj-$(CONFIG_CI_UDC) += ci_udc.o
|
||||||
else
|
|
||||||
|
obj-$(CONFIG_USB_ETHER) += ether.o
|
||||||
|
obj-$(CONFIG_USB_ETH_RNDIS) += rndis.o
|
||||||
|
|
||||||
# Devices not related to the new gadget layer depend on CONFIG_USB_DEVICE
|
# Devices not related to the new gadget layer depend on CONFIG_USB_DEVICE
|
||||||
ifdef CONFIG_USB_DEVICE
|
# This is really only N900 and USBTTY now.
|
||||||
obj-y += core.o
|
obj-$(CONFIG_USB_DEVICE) += core.o ep0.o
|
||||||
obj-y += ep0.o
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
@@ -544,6 +544,7 @@ static void rx_handler_command(struct usb_ep *ep, struct usb_request *req)
|
|||||||
case FASTBOOT_COMMAND_REBOOT_FASTBOOTD:
|
case FASTBOOT_COMMAND_REBOOT_FASTBOOTD:
|
||||||
case FASTBOOT_COMMAND_REBOOT_RECOVERY:
|
case FASTBOOT_COMMAND_REBOOT_RECOVERY:
|
||||||
fastboot_func->in_req->complete = compl_do_reset;
|
fastboot_func->in_req->complete = compl_do_reset;
|
||||||
|
g_dnl_trigger_detach();
|
||||||
break;
|
break;
|
||||||
#if CONFIG_IS_ENABLED(FASTBOOT_UUU_SUPPORT)
|
#if CONFIG_IS_ENABLED(FASTBOOT_UUU_SUPPORT)
|
||||||
case FASTBOOT_COMMAND_ACMD:
|
case FASTBOOT_COMMAND_ACMD:
|
||||||
|
@@ -96,7 +96,7 @@ static int ehci_usb_probe(struct udevice *dev)
|
|||||||
if (err)
|
if (err)
|
||||||
goto reset_err;
|
goto reset_err;
|
||||||
|
|
||||||
err = ehci_setup_phy(dev, &priv->phy, 0);
|
err = generic_setup_phy(dev, &priv->phy, 0);
|
||||||
if (err)
|
if (err)
|
||||||
goto regulator_err;
|
goto regulator_err;
|
||||||
|
|
||||||
@@ -111,7 +111,7 @@ static int ehci_usb_probe(struct udevice *dev)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
phy_err:
|
phy_err:
|
||||||
ret = ehci_shutdown_phy(dev, &priv->phy);
|
ret = generic_shutdown_phy(&priv->phy);
|
||||||
if (ret)
|
if (ret)
|
||||||
dev_err(dev, "failed to shutdown usb phy (ret=%d)\n", ret);
|
dev_err(dev, "failed to shutdown usb phy (ret=%d)\n", ret);
|
||||||
|
|
||||||
@@ -141,7 +141,7 @@ static int ehci_usb_remove(struct udevice *dev)
|
|||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
ret = ehci_shutdown_phy(dev, &priv->phy);
|
ret = generic_shutdown_phy(&priv->phy);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
@@ -1767,69 +1767,3 @@ struct dm_usb_ops ehci_usb_ops = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_PHY
|
|
||||||
int ehci_setup_phy(struct udevice *dev, struct phy *phy, int index)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (!phy)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
ret = generic_phy_get_by_index(dev, index, phy);
|
|
||||||
if (ret) {
|
|
||||||
if (ret != -ENOENT) {
|
|
||||||
dev_err(dev, "failed to get usb phy\n");
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ret = generic_phy_init(phy);
|
|
||||||
if (ret) {
|
|
||||||
dev_dbg(dev, "failed to init usb phy\n");
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = generic_phy_power_on(phy);
|
|
||||||
if (ret) {
|
|
||||||
dev_dbg(dev, "failed to power on usb phy\n");
|
|
||||||
return generic_phy_exit(phy);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ehci_shutdown_phy(struct udevice *dev, struct phy *phy)
|
|
||||||
{
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
if (!phy)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (generic_phy_valid(phy)) {
|
|
||||||
ret = generic_phy_power_off(phy);
|
|
||||||
if (ret) {
|
|
||||||
dev_dbg(dev, "failed to power off usb phy\n");
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = generic_phy_exit(phy);
|
|
||||||
if (ret) {
|
|
||||||
dev_dbg(dev, "failed to power off usb phy\n");
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
int ehci_setup_phy(struct udevice *dev, struct phy *phy, int index)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ehci_shutdown_phy(struct udevice *dev, struct phy *phy)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
@@ -56,7 +56,7 @@ static int ehci_usb_probe(struct udevice *dev)
|
|||||||
hcor = (struct ehci_hcor *)((phys_addr_t)hccr +
|
hcor = (struct ehci_hcor *)((phys_addr_t)hccr +
|
||||||
HC_LENGTH(ehci_readl(&(hccr)->cr_capbase)));
|
HC_LENGTH(ehci_readl(&(hccr)->cr_capbase)));
|
||||||
|
|
||||||
ret = ehci_setup_phy(dev, &p->phy, 0);
|
ret = generic_setup_phy(dev, &p->phy, 0);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
@@ -81,7 +81,7 @@ static int ehci_usb_remove(struct udevice *dev)
|
|||||||
/* Stop controller. */
|
/* Stop controller. */
|
||||||
clrbits_le32(&ehci->usbcmd, CMD_RUN);
|
clrbits_le32(&ehci->usbcmd, CMD_RUN);
|
||||||
|
|
||||||
ret = ehci_shutdown_phy(dev, &p->phy);
|
ret = generic_shutdown_phy(&p->phy);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
@@ -726,7 +726,7 @@ static int ehci_usb_probe(struct udevice *dev)
|
|||||||
mdelay(10);
|
mdelay(10);
|
||||||
|
|
||||||
#if defined(CONFIG_PHY)
|
#if defined(CONFIG_PHY)
|
||||||
ret = ehci_setup_phy(dev, &priv->phy, 0);
|
ret = generic_setup_phy(dev, &priv->phy, 0);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err_regulator;
|
goto err_regulator;
|
||||||
#endif
|
#endif
|
||||||
@@ -743,7 +743,7 @@ static int ehci_usb_probe(struct udevice *dev)
|
|||||||
|
|
||||||
err_phy:
|
err_phy:
|
||||||
#if defined(CONFIG_PHY)
|
#if defined(CONFIG_PHY)
|
||||||
ehci_shutdown_phy(dev, &priv->phy);
|
generic_shutdown_phy(&priv->phy);
|
||||||
err_regulator:
|
err_regulator:
|
||||||
#endif
|
#endif
|
||||||
#if CONFIG_IS_ENABLED(DM_REGULATOR)
|
#if CONFIG_IS_ENABLED(DM_REGULATOR)
|
||||||
@@ -767,7 +767,7 @@ int ehci_usb_remove(struct udevice *dev)
|
|||||||
ehci_deregister(dev);
|
ehci_deregister(dev);
|
||||||
|
|
||||||
#if defined(CONFIG_PHY)
|
#if defined(CONFIG_PHY)
|
||||||
ehci_shutdown_phy(dev, &priv->phy);
|
generic_shutdown_phy(&priv->phy);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if CONFIG_IS_ENABLED(DM_REGULATOR)
|
#if CONFIG_IS_ENABLED(DM_REGULATOR)
|
||||||
|
@@ -31,7 +31,7 @@ static int ehci_pci_init(struct udevice *dev, struct ehci_hccr **ret_hccr,
|
|||||||
int ret;
|
int ret;
|
||||||
u32 cmd;
|
u32 cmd;
|
||||||
|
|
||||||
ret = ehci_setup_phy(dev, &priv->phy, 0);
|
ret = generic_setup_phy(dev, &priv->phy, 0);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
@@ -149,7 +149,7 @@ static int ehci_pci_remove(struct udevice *dev)
|
|||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
return ehci_shutdown_phy(dev, &priv->phy);
|
return generic_shutdown_phy(&priv->phy);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct udevice_id ehci_pci_ids[] = {
|
static const struct udevice_id ehci_pci_ids[] = {
|
||||||
|
@@ -295,9 +295,5 @@ int ehci_register(struct udevice *dev, struct ehci_hccr *hccr,
|
|||||||
int ehci_deregister(struct udevice *dev);
|
int ehci_deregister(struct udevice *dev);
|
||||||
extern struct dm_usb_ops ehci_usb_ops;
|
extern struct dm_usb_ops ehci_usb_ops;
|
||||||
|
|
||||||
/* EHCI PHY functions */
|
|
||||||
int ehci_setup_phy(struct udevice *dev, struct phy *phy, int index);
|
|
||||||
int ehci_shutdown_phy(struct udevice *dev, struct phy *phy);
|
|
||||||
|
|
||||||
#include <linux/bitops.h>
|
#include <linux/bitops.h>
|
||||||
#endif /* USB_EHCI_H */
|
#endif /* USB_EHCI_H */
|
||||||
|
@@ -23,56 +23,6 @@ struct generic_ohci {
|
|||||||
int reset_count; /* number of reset in reset list */
|
int reset_count; /* number of reset in reset list */
|
||||||
};
|
};
|
||||||
|
|
||||||
static int ohci_setup_phy(struct udevice *dev, int index)
|
|
||||||
{
|
|
||||||
struct generic_ohci *priv = dev_get_priv(dev);
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
ret = generic_phy_get_by_index(dev, index, &priv->phy);
|
|
||||||
if (ret) {
|
|
||||||
if (ret != -ENOENT) {
|
|
||||||
dev_err(dev, "failed to get usb phy\n");
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ret = generic_phy_init(&priv->phy);
|
|
||||||
if (ret) {
|
|
||||||
dev_dbg(dev, "failed to init usb phy\n");
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = generic_phy_power_on(&priv->phy);
|
|
||||||
if (ret) {
|
|
||||||
dev_dbg(dev, "failed to power on usb phy\n");
|
|
||||||
return generic_phy_exit(&priv->phy);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int ohci_shutdown_phy(struct udevice *dev)
|
|
||||||
{
|
|
||||||
struct generic_ohci *priv = dev_get_priv(dev);
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
if (generic_phy_valid(&priv->phy)) {
|
|
||||||
ret = generic_phy_power_off(&priv->phy);
|
|
||||||
if (ret) {
|
|
||||||
dev_dbg(dev, "failed to power off usb phy\n");
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = generic_phy_exit(&priv->phy);
|
|
||||||
if (ret) {
|
|
||||||
dev_dbg(dev, "failed to power off usb phy\n");
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int ohci_usb_probe(struct udevice *dev)
|
static int ohci_usb_probe(struct udevice *dev)
|
||||||
{
|
{
|
||||||
struct ohci_regs *regs = dev_read_addr_ptr(dev);
|
struct ohci_regs *regs = dev_read_addr_ptr(dev);
|
||||||
@@ -135,7 +85,7 @@ static int ohci_usb_probe(struct udevice *dev)
|
|||||||
goto clk_err;
|
goto clk_err;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = ohci_setup_phy(dev, 0);
|
err = generic_setup_phy(dev, &priv->phy, 0);
|
||||||
if (err)
|
if (err)
|
||||||
goto reset_err;
|
goto reset_err;
|
||||||
|
|
||||||
@@ -146,7 +96,7 @@ static int ohci_usb_probe(struct udevice *dev)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
phy_err:
|
phy_err:
|
||||||
ret = ohci_shutdown_phy(dev);
|
ret = generic_shutdown_phy(&priv->phy);
|
||||||
if (ret)
|
if (ret)
|
||||||
dev_err(dev, "failed to shutdown usb phy\n");
|
dev_err(dev, "failed to shutdown usb phy\n");
|
||||||
|
|
||||||
@@ -171,7 +121,7 @@ static int ohci_usb_remove(struct udevice *dev)
|
|||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
ret = ohci_shutdown_phy(dev);
|
ret = generic_shutdown_phy(&priv->phy);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
@@ -342,6 +342,26 @@ int generic_phy_power_on_bulk(struct phy_bulk *bulk);
|
|||||||
*/
|
*/
|
||||||
int generic_phy_power_off_bulk(struct phy_bulk *bulk);
|
int generic_phy_power_off_bulk(struct phy_bulk *bulk);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* generic_setup_phy() - Get, initialize and power on phy.
|
||||||
|
*
|
||||||
|
* @dev: The consumer device.
|
||||||
|
* @phy: A pointer to the PHY port
|
||||||
|
* @index: The index in the list of available PHYs
|
||||||
|
*
|
||||||
|
* Return: 0 if OK, or negative error code.
|
||||||
|
*/
|
||||||
|
int generic_setup_phy(struct udevice *dev, struct phy *phy, int index);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* generic_shutdown_phy() - Power off and de-initialize phy.
|
||||||
|
*
|
||||||
|
* @phy: A pointer to the PHY port.
|
||||||
|
*
|
||||||
|
* Return: 0 if OK, or negative error code.
|
||||||
|
*/
|
||||||
|
int generic_shutdown_phy(struct phy *phy);
|
||||||
|
|
||||||
#else /* CONFIG_PHY */
|
#else /* CONFIG_PHY */
|
||||||
|
|
||||||
static inline int generic_phy_init(struct phy *phy)
|
static inline int generic_phy_init(struct phy *phy)
|
||||||
@@ -407,6 +427,16 @@ static inline int generic_phy_power_off_bulk(struct phy_bulk *bulk)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int generic_setup_phy(struct udevice *dev, struct phy *phy, int index)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int generic_shutdown_phy(struct phy *phy)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* CONFIG_PHY */
|
#endif /* CONFIG_PHY */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user