mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-11 23:47:24 +00:00
usb: host: Add simple of glue driver for DWC3 USB Controllers integration
This is a port of the dwc3-of-simple driver from Linux to enable/deassert clock and resets of a simple DWC3 Controller HW glue. Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
This commit is contained in:
parent
c4446b1d6c
commit
ca7fdc8b12
3 changed files with 117 additions and 0 deletions
|
@ -21,6 +21,13 @@ config USB_XHCI_DWC3
|
|||
Say Y or if your system has a Dual Role SuperSpeed
|
||||
USB controller based on the DesignWare USB3 IP Core.
|
||||
|
||||
config USB_XHCI_DWC3_OF_SIMPLE
|
||||
bool "DesignWare USB3 DRD Generic OF Simple Glue Layer"
|
||||
select MISC
|
||||
help
|
||||
Support USB2/3 functionality in simple SoC integrations with
|
||||
USB controller based on the DesignWare USB3 IP Core.
|
||||
|
||||
config USB_XHCI_MVEBU
|
||||
bool "MVEBU USB 3.0 support"
|
||||
default y
|
||||
|
|
|
@ -49,6 +49,7 @@ obj-$(CONFIG_USB_EHCI_ZYNQ) += ehci-zynq.o
|
|||
# xhci
|
||||
obj-$(CONFIG_USB_XHCI_HCD) += xhci.o xhci-mem.o xhci-ring.o
|
||||
obj-$(CONFIG_USB_XHCI_DWC3) += xhci-dwc3.o
|
||||
obj-$(CONFIG_USB_XHCI_DWC3_OF_SIMPLE) += dwc3-of-simple.o
|
||||
obj-$(CONFIG_USB_XHCI_ROCKCHIP) += xhci-rockchip.o
|
||||
obj-$(CONFIG_USB_XHCI_ZYNQMP) += xhci-zynqmp.o
|
||||
obj-$(CONFIG_USB_XHCI_KEYSTONE) += xhci-keystone.o
|
||||
|
|
109
drivers/usb/host/dwc3-of-simple.c
Normal file
109
drivers/usb/host/dwc3-of-simple.c
Normal file
|
@ -0,0 +1,109 @@
|
|||
/*
|
||||
* dwc3-of-simple.c - OF glue layer for simple integrations
|
||||
*
|
||||
* Copyright (c) 2015 Texas Instruments Incorporated - http://www.ti.com
|
||||
*
|
||||
* Author: Felipe Balbi <balbi@ti.com>
|
||||
*
|
||||
* Copyright (C) 2018 BayLibre, SAS
|
||||
* Author: Neil Armstrong <narmstron@baylibre.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <dm.h>
|
||||
#include <fdtdec.h>
|
||||
#include <reset.h>
|
||||
#include <clk.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
struct dwc3_of_simple {
|
||||
struct clk_bulk clks;
|
||||
struct reset_ctl_bulk resets;
|
||||
};
|
||||
|
||||
static int dwc3_of_simple_reset_init(struct udevice *dev,
|
||||
struct dwc3_of_simple *simple)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = reset_get_bulk(dev, &simple->resets);
|
||||
if (ret == -ENOTSUPP)
|
||||
return 0;
|
||||
else if (ret)
|
||||
return ret;
|
||||
|
||||
ret = reset_deassert_bulk(&simple->resets);
|
||||
if (ret) {
|
||||
reset_release_bulk(&simple->resets);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dwc3_of_simple_clk_init(struct udevice *dev,
|
||||
struct dwc3_of_simple *simple)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = clk_get_bulk(dev, &simple->clks);
|
||||
if (ret == -ENOTSUPP)
|
||||
return 0;
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
#if CONFIG_IS_ENABLED(CLK)
|
||||
ret = clk_enable_bulk(&simple->clks);
|
||||
if (ret) {
|
||||
clk_release_bulk(&simple->clks);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dwc3_of_simple_probe(struct udevice *dev)
|
||||
{
|
||||
struct dwc3_of_simple *simple = dev_get_platdata(dev);
|
||||
int ret;
|
||||
|
||||
ret = dwc3_of_simple_clk_init(dev, simple);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = dwc3_of_simple_reset_init(dev, simple);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dwc3_of_simple_remove(struct udevice *dev)
|
||||
{
|
||||
struct dwc3_of_simple *simple = dev_get_platdata(dev);
|
||||
|
||||
reset_release_bulk(&simple->resets);
|
||||
|
||||
clk_release_bulk(&simple->clks);
|
||||
|
||||
return dm_scan_fdt_dev(dev);
|
||||
}
|
||||
|
||||
static const struct udevice_id dwc3_of_simple_ids[] = {
|
||||
{ .compatible = "amlogic,meson-gxl-dwc3" },
|
||||
{ }
|
||||
};
|
||||
|
||||
U_BOOT_DRIVER(dwc3_of_simple) = {
|
||||
.name = "dwc3-of-simple",
|
||||
.id = UCLASS_SIMPLE_BUS,
|
||||
.of_match = dwc3_of_simple_ids,
|
||||
.probe = dwc3_of_simple_probe,
|
||||
.remove = dwc3_of_simple_remove,
|
||||
.platdata_auto_alloc_size = sizeof(struct dwc3_of_simple),
|
||||
.flags = DM_FLAG_ALLOC_PRIV_DMA,
|
||||
};
|
Loading…
Reference in a new issue