forked from Xilinx/u-boot-xlnx
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
usb: zynqmp: Add XHCI driver support
Added USB XHCI driver support for zynqmp. Signed-off-by: Siva Durga Prasad Paladugu <[email protected]> Signed-off-by: Michal Simek <[email protected]>
- Loading branch information
Siva Durga Prasad Paladugu
authored and
Michal Simek
committed
Aug 10, 2015
1 parent
2d5bc21
commit 0a97ebc
Showing
3 changed files
with
170 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,113 @@ | ||
/* | ||
* Copyright 2015 Xilinx, Inc. | ||
* | ||
* Zynq USB HOST xHCI Controller | ||
* | ||
* Author: Siva Durga Prasad Paladugu <[email protected]> | ||
* | ||
* This file was resused from Freescale USB xHCI | ||
* | ||
* SPDX-License-Identifier: GPL-2.0+ | ||
*/ | ||
|
||
#include <common.h> | ||
#include <usb.h> | ||
#include <asm-generic/errno.h> | ||
#include <asm/arch-zynqmp/hardware.h> | ||
#include <linux/compat.h> | ||
#include <linux/usb/xhci-zynqmp.h> | ||
#include <linux/usb/dwc3.h> | ||
#include "xhci.h" | ||
|
||
/* Declare global data pointer */ | ||
DECLARE_GLOBAL_DATA_PTR; | ||
|
||
static struct zynqmp_xhci zynqmp_xhci; | ||
|
||
unsigned long ctr_addr[] = {ZYNQMP_USB0_XHCI_BASEADDR, | ||
ZYNQMP_USB1_XHCI_BASEADDR}; | ||
|
||
__weak int __board_usb_init(int index, enum usb_init_type init) | ||
{ | ||
return 0; | ||
} | ||
|
||
void usb_phy_reset(struct dwc3 *dwc3_reg) | ||
{ | ||
/* Assert USB3 PHY reset */ | ||
setbits_le32(&dwc3_reg->g_usb3pipectl[0], DWC3_GUSB3PIPECTL_PHYSOFTRST); | ||
|
||
/* Assert USB2 PHY reset */ | ||
setbits_le32(&dwc3_reg->g_usb2phycfg, DWC3_GUSB2PHYCFG_PHYSOFTRST); | ||
|
||
mdelay(200); | ||
|
||
/* Clear USB3 PHY reset */ | ||
clrbits_le32(&dwc3_reg->g_usb3pipectl[0], DWC3_GUSB3PIPECTL_PHYSOFTRST); | ||
|
||
/* Clear USB2 PHY reset */ | ||
clrbits_le32(&dwc3_reg->g_usb2phycfg, DWC3_GUSB2PHYCFG_PHYSOFTRST); | ||
} | ||
|
||
static int zynqmp_xhci_core_init(struct zynqmp_xhci *zynqmp_xhci) | ||
{ | ||
int ret = 0; | ||
|
||
ret = dwc3_core_init(zynqmp_xhci->dwc3_reg); | ||
if (ret) { | ||
debug("%s:failed to initialize core\n", __func__); | ||
return ret; | ||
} | ||
|
||
/* We are hard-coding DWC3 core to Host Mode */ | ||
dwc3_set_mode(zynqmp_xhci->dwc3_reg, DWC3_GCTL_PRTCAP_HOST); | ||
|
||
return ret; | ||
} | ||
|
||
static int zynqmp_xhci_core_exit(struct zynqmp_xhci *zynqmp_xhci) | ||
{ | ||
/* | ||
* Currently zynqmp socs do not support PHY shutdown from | ||
* sw. But this support may be added in future socs. | ||
*/ | ||
return 0; | ||
} | ||
|
||
int xhci_hcd_init(int index, struct xhci_hccr **hccr, struct xhci_hcor **hcor) | ||
{ | ||
struct zynqmp_xhci *ctx = &zynqmp_xhci; | ||
int ret = 0; | ||
|
||
ctx->hcd = (struct xhci_hccr *)ctr_addr[index]; | ||
ctx->dwc3_reg = (struct dwc3 *)((char *)(ctx->hcd) + DWC3_REG_OFFSET); | ||
|
||
ret = board_usb_init(index, USB_INIT_HOST); | ||
if (ret != 0) { | ||
puts("Failed to initialize board for USB\n"); | ||
return ret; | ||
} | ||
|
||
ret = zynqmp_xhci_core_init(ctx); | ||
if (ret < 0) { | ||
puts("Failed to initialize xhci\n"); | ||
return ret; | ||
} | ||
|
||
*hccr = (struct xhci_hccr *)ctx->hcd; | ||
*hcor = (struct xhci_hcor *)((uint32_t) *hccr | ||
+ HC_LENGTH(xhci_readl(&(*hccr)->cr_capbase))); | ||
|
||
debug("zynqmp-xhci: init hccr %x and hcor %x hc_length %d\n", | ||
(uint32_t)*hccr, (uint32_t)*hcor, | ||
(uint32_t)HC_LENGTH(xhci_readl(&(*hccr)->cr_capbase))); | ||
|
||
return ret; | ||
} | ||
|
||
void xhci_hcd_stop(int index) | ||
{ | ||
struct zynqmp_xhci *ctx = &zynqmp_xhci; | ||
|
||
zynqmp_xhci_core_exit(ctx); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
/* | ||
* Copyright 2015 Xilinx, Inc. | ||
* | ||
* Zynq USB HOST xHCI Controller | ||
* | ||
* Author: Siva Durga Prasad Paladugu <[email protected]> | ||
* | ||
* This file was resused from Freescale USB xHCI | ||
* | ||
* SPDX-License-Identifier: GPL-2.0+ | ||
*/ | ||
|
||
#ifndef _LINUX_USB_XHCI_ZYNQMP_H_ | ||
#define _LINUX_USB_XHCI_ZYNQMP_H_ | ||
|
||
/* Default to the FSL XHCI defines */ | ||
#define USB3_PWRCTL_CLK_CMD_MASK 0x3FE000 | ||
#define USB3_PWRCTL_CLK_FREQ_MASK 0xFFC | ||
#define USB3_PHY_PARTIAL_RX_POWERON BIT(6) | ||
#define USB3_PHY_RX_POWERON BIT(14) | ||
#define USB3_PHY_TX_POWERON BIT(15) | ||
#define USB3_PHY_TX_RX_POWERON (USB3_PHY_RX_POWERON | USB3_PHY_TX_POWERON) | ||
#define USB3_PWRCTL_CLK_CMD_SHIFT 14 | ||
#define USB3_PWRCTL_CLK_FREQ_SHIFT 22 | ||
|
||
/* USBOTGSS_WRAPPER definitions */ | ||
#define USBOTGSS_WRAPRESET BIT(17) | ||
#define USBOTGSS_DMADISABLE BIT(16) | ||
#define USBOTGSS_STANDBYMODE_NO_STANDBY BIT(4) | ||
#define USBOTGSS_STANDBYMODE_SMRT BIT(5) | ||
#define USBOTGSS_STANDBYMODE_SMRT_WKUP (0x3 << 4) | ||
#define USBOTGSS_IDLEMODE_NOIDLE BIT(2) | ||
#define USBOTGSS_IDLEMODE_SMRT BIT(3) | ||
#define USBOTGSS_IDLEMODE_SMRT_WKUP (0x3 << 2) | ||
|
||
/* USBOTGSS_IRQENABLE_SET_0 bit */ | ||
#define USBOTGSS_COREIRQ_EN BIT(1) | ||
|
||
/* USBOTGSS_IRQENABLE_SET_1 bits */ | ||
#define USBOTGSS_IRQ_SET_1_IDPULLUP_FALL_EN BIT(1) | ||
#define USBOTGSS_IRQ_SET_1_DISCHRGVBUS_FALL_EN BIT(3) | ||
#define USBOTGSS_IRQ_SET_1_CHRGVBUS_FALL_EN BIT(4) | ||
#define USBOTGSS_IRQ_SET_1_DRVVBUS_FALL_EN BIT(5) | ||
#define USBOTGSS_IRQ_SET_1_IDPULLUP_RISE_EN BIT(8) | ||
#define USBOTGSS_IRQ_SET_1_DISCHRGVBUS_RISE_EN BIT(11) | ||
#define USBOTGSS_IRQ_SET_1_CHRGVBUS_RISE_EN BIT(12) | ||
#define USBOTGSS_IRQ_SET_1_DRVVBUS_RISE_EN BIT(13) | ||
#define USBOTGSS_IRQ_SET_1_OEVT_EN BIT(16) | ||
#define USBOTGSS_IRQ_SET_1_DMADISABLECLR_EN BIT(17) | ||
|
||
struct zynqmp_xhci { | ||
struct xhci_hccr *hcd; | ||
struct dwc3 *dwc3_reg; | ||
}; | ||
|
||
#endif /* _LINUX_USB_XHCI_ZYNQMP_H_ */ |