usb: add support for generic EHCI devices
This driver is meant to be used with any EHCI-compatible host controller in case if there's no need for platform-specific glue such as setup of controller or PHY's power mode via GPIOs etc. Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com> Cc: Stephen Warren <swarren@nvidia.com> Cc: Simon Glass <sjg@chromium.org> Cc: Marek Vasut <marex@denx.de>
This commit is contained in:
parent
40c920821d
commit
90fbb2823a
@ -73,4 +73,12 @@ config USB_EHCI_UNIPHIER
|
||||
---help---
|
||||
Enables support for the on-chip EHCI controller on UniPhier SoCs.
|
||||
|
||||
config USB_EHCI_GENERIC
|
||||
bool "Support for generic EHCI USB controller"
|
||||
depends on OF_CONTROL
|
||||
depends on DM_USB
|
||||
default n
|
||||
---help---
|
||||
Enables support for generic EHCI controller.
|
||||
|
||||
endif
|
||||
|
@ -32,6 +32,7 @@ else
|
||||
obj-$(CONFIG_USB_EHCI_FSL) += ehci-fsl.o
|
||||
endif
|
||||
obj-$(CONFIG_USB_EHCI_FARADAY) += ehci-faraday.o
|
||||
obj-$(CONFIG_USB_EHCI_GENERIC) += ehci-generic.o
|
||||
obj-$(CONFIG_USB_EHCI_EXYNOS) += ehci-exynos.o
|
||||
obj-$(CONFIG_USB_EHCI_MXC) += ehci-mxc.o
|
||||
obj-$(CONFIG_USB_EHCI_MXS) += ehci-mxs.o
|
||||
|
50
drivers/usb/host/ehci-generic.c
Normal file
50
drivers/usb/host/ehci-generic.c
Normal file
@ -0,0 +1,50 @@
|
||||
/*
|
||||
* Copyright (C) 2015 Alexey Brodkin <abrodkin@synopsys.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <dm.h>
|
||||
#include "ehci.h"
|
||||
|
||||
/*
|
||||
* Even though here we don't explicitly use "struct ehci_ctrl"
|
||||
* ehci_register() expects it to be the first thing that resides in
|
||||
* device's private data.
|
||||
*/
|
||||
struct generic_ehci {
|
||||
struct ehci_ctrl ctrl;
|
||||
};
|
||||
|
||||
static int ehci_usb_probe(struct udevice *dev)
|
||||
{
|
||||
struct ehci_hccr *hccr = (struct ehci_hccr *)dev_get_addr(dev);
|
||||
struct ehci_hcor *hcor;
|
||||
|
||||
hcor = (struct ehci_hcor *)((uintptr_t)hccr +
|
||||
HC_LENGTH(ehci_readl(&hccr->cr_capbase)));
|
||||
|
||||
return ehci_register(dev, hccr, hcor, NULL, 0, USB_INIT_HOST);
|
||||
}
|
||||
|
||||
static int ehci_usb_remove(struct udevice *dev)
|
||||
{
|
||||
return ehci_deregister(dev);
|
||||
}
|
||||
|
||||
static const struct udevice_id ehci_usb_ids[] = {
|
||||
{ .compatible = "generic-ehci" },
|
||||
{ }
|
||||
};
|
||||
|
||||
U_BOOT_DRIVER(ehci_generic) = {
|
||||
.name = "ehci_generic",
|
||||
.id = UCLASS_USB,
|
||||
.of_match = ehci_usb_ids,
|
||||
.probe = ehci_usb_probe,
|
||||
.remove = ehci_usb_remove,
|
||||
.ops = &ehci_usb_ops,
|
||||
.priv_auto_alloc_size = sizeof(struct generic_ehci),
|
||||
.flags = DM_FLAG_ALLOC_PRIV_DMA,
|
||||
};
|
Loading…
Reference in New Issue
Block a user