|
@@ -16,17 +16,23 @@
|
|
|
/* Information about a USB port */
|
|
|
struct ehci_pci_priv {
|
|
|
struct ehci_ctrl ehci;
|
|
|
+ struct phy phy;
|
|
|
};
|
|
|
|
|
|
#ifdef CONFIG_DM_USB
|
|
|
-
|
|
|
-static void ehci_pci_init(struct udevice *dev, struct ehci_hccr **ret_hccr,
|
|
|
+static int ehci_pci_init(struct udevice *dev, struct ehci_hccr **ret_hccr,
|
|
|
struct ehci_hcor **ret_hcor)
|
|
|
{
|
|
|
+ struct ehci_pci_priv *priv = dev_get_priv(dev);
|
|
|
struct ehci_hccr *hccr;
|
|
|
struct ehci_hcor *hcor;
|
|
|
+ int ret;
|
|
|
u32 cmd;
|
|
|
|
|
|
+ ret = ehci_setup_phy(dev, &priv->phy, 0);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
hccr = (struct ehci_hccr *)dm_pci_map_bar(dev,
|
|
|
PCI_BASE_ADDRESS_0, PCI_REGION_MEM);
|
|
|
hcor = (struct ehci_hcor *)((uintptr_t) hccr +
|
|
@@ -43,6 +49,8 @@ static void ehci_pci_init(struct udevice *dev, struct ehci_hccr **ret_hccr,
|
|
|
dm_pci_read_config32(dev, PCI_COMMAND, &cmd);
|
|
|
cmd |= PCI_COMMAND_MASTER;
|
|
|
dm_pci_write_config32(dev, PCI_COMMAND, cmd);
|
|
|
+
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
#else
|
|
@@ -120,12 +128,27 @@ static int ehci_pci_probe(struct udevice *dev)
|
|
|
{
|
|
|
struct ehci_hccr *hccr;
|
|
|
struct ehci_hcor *hcor;
|
|
|
+ int ret;
|
|
|
|
|
|
- ehci_pci_init(dev, &hccr, &hcor);
|
|
|
+ ret = ehci_pci_init(dev, &hccr, &hcor);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
|
|
|
return ehci_register(dev, hccr, hcor, NULL, 0, USB_INIT_HOST);
|
|
|
}
|
|
|
|
|
|
+static int ehci_pci_remove(struct udevice *dev)
|
|
|
+{
|
|
|
+ struct ehci_pci_priv *priv = dev_get_priv(dev);
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ ret = ehci_deregister(dev);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ return ehci_shutdown_phy(dev, &priv->phy);
|
|
|
+}
|
|
|
+
|
|
|
static const struct udevice_id ehci_pci_ids[] = {
|
|
|
{ .compatible = "ehci-pci" },
|
|
|
{ }
|
|
@@ -135,7 +158,7 @@ U_BOOT_DRIVER(ehci_pci) = {
|
|
|
.name = "ehci_pci",
|
|
|
.id = UCLASS_USB,
|
|
|
.probe = ehci_pci_probe,
|
|
|
- .remove = ehci_deregister,
|
|
|
+ .remove = ehci_pci_remove,
|
|
|
.of_match = ehci_pci_ids,
|
|
|
.ops = &ehci_usb_ops,
|
|
|
.platdata_auto_alloc_size = sizeof(struct usb_platdata),
|