mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 15:14:43 +00:00
usb: UniPhier: add UniPhier on-chip xHCI host driver support
Support xHCI host driver used on Panasonic UniPhier platform. Signed-off-by: Masahiro Yamada <yamada.m@jp.panasonic.com> Acked-by: Marek Vasut <marex@denx.de>
This commit is contained in:
parent
de01a768f0
commit
1e7df7c4e4
6 changed files with 98 additions and 1 deletions
|
@ -73,7 +73,8 @@ Supported devices
|
|||
|
||||
- UART (on-chip)
|
||||
- NAND
|
||||
- USB (2.0)
|
||||
- USB 2.0 (EHCI)
|
||||
- USB 3.0 (xHCI)
|
||||
- LAN (on-board SMSC9118)
|
||||
- I2C
|
||||
- EEPROM (connected to the on-board I2C bus)
|
||||
|
|
|
@ -17,6 +17,14 @@ config USB_XHCI
|
|||
|
||||
if USB_XHCI_HCD
|
||||
|
||||
config USB_XHCI_UNIPHIER
|
||||
bool "Support for Panasonic UniPhier on-chip xHCI USB controller"
|
||||
depends on ARCH_UNIPHIER
|
||||
default y
|
||||
---help---
|
||||
Enables support for the on-chip xHCI controller on Panasonic
|
||||
UniPhier SoCs.
|
||||
|
||||
endif
|
||||
|
||||
config USB_EHCI_HCD
|
||||
|
|
|
@ -48,6 +48,7 @@ obj-$(CONFIG_USB_XHCI_KEYSTONE) += xhci-keystone.o
|
|||
obj-$(CONFIG_USB_XHCI_EXYNOS) += xhci-exynos5.o
|
||||
obj-$(CONFIG_USB_XHCI_OMAP) += xhci-omap.o
|
||||
obj-$(CONFIG_USB_XHCI_PCI) += xhci-pci.o
|
||||
obj-$(CONFIG_USB_XHCI_UNIPHIER) += xhci-uniphier.o
|
||||
|
||||
# designware
|
||||
obj-$(CONFIG_USB_DWC2) += dwc2.o
|
||||
|
|
85
drivers/usb/host/xhci-uniphier.c
Normal file
85
drivers/usb/host/xhci-uniphier.c
Normal file
|
@ -0,0 +1,85 @@
|
|||
/*
|
||||
* Copyright (C) 2015 Panasonic Corporation
|
||||
* Author: Masahiro Yamada <yamada.m@jp.panasonic.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <linux/err.h>
|
||||
#include <usb.h>
|
||||
#include <fdtdec.h>
|
||||
#include "xhci.h"
|
||||
|
||||
static int get_uniphier_xhci_base(int index, struct xhci_hccr **base)
|
||||
{
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
int node_list[2];
|
||||
fdt_addr_t addr;
|
||||
int count;
|
||||
|
||||
count = fdtdec_find_aliases_for_id(gd->fdt_blob, "usb",
|
||||
COMPAT_PANASONIC_XHCI, node_list,
|
||||
ARRAY_SIZE(node_list));
|
||||
|
||||
if (index >= count)
|
||||
return -ENODEV;
|
||||
|
||||
addr = fdtdec_get_addr(gd->fdt_blob, node_list[index], "reg");
|
||||
if (addr == FDT_ADDR_T_NONE)
|
||||
return -ENODEV;
|
||||
|
||||
*base = (struct xhci_hccr *)addr;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define USB3_RST_CTRL 0x00100040
|
||||
#define IOMMU_RST_N (1 << 5)
|
||||
#define LINK_RST_N (1 << 4)
|
||||
|
||||
static void uniphier_xhci_reset(void __iomem *base, int on)
|
||||
{
|
||||
u32 tmp;
|
||||
|
||||
tmp = readl(base + USB3_RST_CTRL);
|
||||
|
||||
if (on)
|
||||
tmp &= ~(IOMMU_RST_N | LINK_RST_N);
|
||||
else
|
||||
tmp |= IOMMU_RST_N | LINK_RST_N;
|
||||
|
||||
writel(tmp, base + USB3_RST_CTRL);
|
||||
}
|
||||
|
||||
int xhci_hcd_init(int index, struct xhci_hccr **hccr, struct xhci_hcor **hcor)
|
||||
{
|
||||
int ret;
|
||||
struct xhci_hccr *cr;
|
||||
struct xhci_hcor *or;
|
||||
|
||||
ret = get_uniphier_xhci_base(index, &cr);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
uniphier_xhci_reset(cr, 0);
|
||||
|
||||
or = (void *)cr + HC_LENGTH(xhci_readl(&cr->cr_capbase));
|
||||
|
||||
*hccr = cr;
|
||||
*hcor = or;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void xhci_hcd_stop(int index)
|
||||
{
|
||||
int ret;
|
||||
struct xhci_hccr *cr;
|
||||
|
||||
ret = get_uniphier_xhci_base(index, &cr);
|
||||
if (ret < 0)
|
||||
return;
|
||||
|
||||
uniphier_xhci_reset(cr, 1);
|
||||
}
|
|
@ -168,6 +168,7 @@ enum fdt_compat_id {
|
|||
COMPAT_AMS_AS3722, /* AMS AS3722 PMIC */
|
||||
COMPAT_INTEL_ICH_SPI, /* Intel ICH7/9 SPI controller */
|
||||
COMPAT_INTEL_QRK_MRC, /* Intel Quark MRC */
|
||||
COMPAT_PANASONIC_XHCI, /* Panasonic UniPhier xHCI */
|
||||
|
||||
COMPAT_COUNT,
|
||||
};
|
||||
|
|
|
@ -76,6 +76,7 @@ static const char * const compat_names[COMPAT_COUNT] = {
|
|||
COMPAT(AMS_AS3722, "ams,as3722"),
|
||||
COMPAT(INTEL_ICH_SPI, "intel,ich-spi"),
|
||||
COMPAT(INTEL_QRK_MRC, "intel,quark-mrc"),
|
||||
COMPAT(PANASONIC_XHCI, "panasonic,uniphier-xhci"),
|
||||
};
|
||||
|
||||
const char *fdtdec_get_compatible(enum fdt_compat_id id)
|
||||
|
|
Loading…
Reference in a new issue