Add UniPhier platform specific glue layer to support USB3 Host mode on Synopsys DWC3 IP. Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> Reviewed-by: Marek Vasut <marex@denx.de>master
parent
72ac8f3fc2
commit
dc04b35ef2
@ -0,0 +1,120 @@ |
||||
/*
|
||||
* UniPhier Specific Glue Layer for DWC3 |
||||
* |
||||
* Copyright (C) 2016-2017 Socionext Inc. |
||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com> |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
|
||||
#include <common.h> |
||||
#include <dm.h> |
||||
#include <linux/errno.h> |
||||
#include <linux/io.h> |
||||
#include <linux/sizes.h> |
||||
|
||||
#define UNIPHIER_PRO4_DWC3_RESET 0x40 |
||||
#define UNIPHIER_PRO4_DWC3_RESET_XIOMMU BIT(5) |
||||
#define UNIPHIER_PRO4_DWC3_RESET_XLINK BIT(4) |
||||
#define UNIPHIER_PRO4_DWC3_RESET_PHY_SS BIT(2) |
||||
|
||||
#define UNIPHIER_PRO5_DWC3_RESET 0x00 |
||||
#define UNIPHIER_PRO5_DWC3_RESET_PHY_S1 BIT(17) |
||||
#define UNIPHIER_PRO5_DWC3_RESET_PHY_S0 BIT(16) |
||||
#define UNIPHIER_PRO5_DWC3_RESET_XLINK BIT(15) |
||||
#define UNIPHIER_PRO5_DWC3_RESET_XIOMMU BIT(14) |
||||
|
||||
#define UNIPHIER_PXS2_DWC3_RESET 0x00 |
||||
#define UNIPHIER_PXS2_DWC3_RESET_XLINK BIT(15) |
||||
|
||||
static int uniphier_pro4_dwc3_init(void __iomem *regs) |
||||
{ |
||||
u32 tmp; |
||||
|
||||
tmp = readl(regs + UNIPHIER_PRO4_DWC3_RESET); |
||||
tmp &= ~UNIPHIER_PRO4_DWC3_RESET_PHY_SS; |
||||
tmp |= UNIPHIER_PRO4_DWC3_RESET_XIOMMU | UNIPHIER_PRO4_DWC3_RESET_XLINK; |
||||
writel(tmp, regs + UNIPHIER_PRO4_DWC3_RESET); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
static int uniphier_pro5_dwc3_init(void __iomem *regs) |
||||
{ |
||||
u32 tmp; |
||||
|
||||
tmp = readl(regs + UNIPHIER_PRO5_DWC3_RESET); |
||||
tmp &= ~(UNIPHIER_PRO5_DWC3_RESET_PHY_S1 | |
||||
UNIPHIER_PRO5_DWC3_RESET_PHY_S0); |
||||
tmp |= UNIPHIER_PRO5_DWC3_RESET_XLINK | UNIPHIER_PRO5_DWC3_RESET_XIOMMU; |
||||
writel(tmp, regs + UNIPHIER_PRO5_DWC3_RESET); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
static int uniphier_pxs2_dwc3_init(void __iomem *regs) |
||||
{ |
||||
u32 tmp; |
||||
|
||||
tmp = readl(regs + UNIPHIER_PXS2_DWC3_RESET); |
||||
tmp |= UNIPHIER_PXS2_DWC3_RESET_XLINK; |
||||
writel(tmp, regs + UNIPHIER_PXS2_DWC3_RESET); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
static int uniphier_dwc3_probe(struct udevice *dev) |
||||
{ |
||||
fdt_addr_t base; |
||||
void __iomem *regs; |
||||
int (*init)(void __iomem *regs); |
||||
int ret; |
||||
|
||||
base = devfdt_get_addr(dev); |
||||
if (base == FDT_ADDR_T_NONE) |
||||
return -EINVAL; |
||||
|
||||
regs = ioremap(base, SZ_32K); |
||||
if (!regs) |
||||
return -ENOMEM; |
||||
|
||||
init = (typeof(init))dev_get_driver_data(dev); |
||||
ret = init(regs); |
||||
if (ret) |
||||
dev_err(dev, "failed to init glue layer\n"); |
||||
|
||||
iounmap(regs); |
||||
|
||||
return ret; |
||||
} |
||||
|
||||
static const struct udevice_id uniphier_dwc3_match[] = { |
||||
{ |
||||
.compatible = "socionext,uniphier-pro4-dwc3", |
||||
.data = (ulong)uniphier_pro4_dwc3_init, |
||||
}, |
||||
{ |
||||
.compatible = "socionext,uniphier-pro5-dwc3", |
||||
.data = (ulong)uniphier_pro5_dwc3_init, |
||||
}, |
||||
{ |
||||
.compatible = "socionext,uniphier-pxs2-dwc3", |
||||
.data = (ulong)uniphier_pxs2_dwc3_init, |
||||
}, |
||||
{ |
||||
.compatible = "socionext,uniphier-ld20-dwc3", |
||||
.data = (ulong)uniphier_pxs2_dwc3_init, |
||||
}, |
||||
{ |
||||
.compatible = "socionext,uniphier-pxs3-dwc3", |
||||
.data = (ulong)uniphier_pxs2_dwc3_init, |
||||
}, |
||||
{ /* sentinel */ } |
||||
}; |
||||
|
||||
U_BOOT_DRIVER(usb_xhci) = { |
||||
.name = "uniphier-dwc3", |
||||
.id = UCLASS_SIMPLE_BUS, |
||||
.of_match = uniphier_dwc3_match, |
||||
.probe = uniphier_dwc3_probe, |
||||
}; |
Loading…
Reference in new issue