usb: ehci: Add PHY support to ehci-pci

Add support for operating a PHY attached to ehci-pci. There are
systems where the EHCI controller is internally wired to a PCI
bus and has a PHY connected to it as well, ie. the R-Car Gen2.

Signed-off-by: Marek Vasut <marek.vasut+renesas@gmail.com>
This commit is contained in:
Marek Vasut 2018-08-07 12:27:10 +02:00 committed by Marek Vasut
parent b43cdf9b3f
commit 1335e7745f

View file

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