/* 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 +
dm_pci_read_config32(dev, PCI_COMMAND, &cmd);
cmd |= PCI_COMMAND_MASTER;
dm_pci_write_config32(dev, PCI_COMMAND, cmd);
+
+ return 0;
}
#else
{
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" },
{ }
.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),