#
# USB Host Controller Drivers
#
comment "USB Host Controller Drivers"

config USB_HOST
	bool
	select DM_USB
	help
	  Enable access to USB (Universal Serial Bus) host devices so that
	  SPL can load U-Boot from a connected USB peripheral, such as a USB
	  flash stick. While USB takes a little longer to start up than most
	  buses, it is very flexible since many different types of storage
	  device can be attached.

config SPL_USB_HOST
	bool "Support USB host drivers"
	depends on SPL
	help
	  For detailed help see USB_HOST Kconfig symbol. This option enables
	  the drivers in drivers/usb/host as part of an SPL build.

config USB_XHCI_HCD
	bool "xHCI HCD (USB 3.0) support"
	depends on DM && OF_CONTROL
	select USB_HOST
	---help---
	  The eXtensible Host Controller Interface (xHCI) is standard for USB 3.0
	  "SuperSpeed" host controller hardware.

if USB_XHCI_HCD

config USB_XHCI_DWC3
	bool "DesignWare USB3 DRD Core Support"
	help
	  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"
	depends on DM_USB
	default y if ARCH_ROCKCHIP
	default y if DRA7XX
	help
	  Support USB2/3 functionality in simple SoC integrations with
	  USB controller based on the DesignWare USB3 IP Core.

config USB_XHCI_EXYNOS
	bool "Support for Samsung Exynos5 family on-chip xHCI USB controller"
	depends on ARCH_EXYNOS5
	default y
	help
	  Enables support for he on-chip xHCI controller on Samsung Exynos5
	  SoCs.

config USB_XHCI_MTK
	bool "Support for MediaTek on-chip xHCI USB controller"
	depends on ARCH_MEDIATEK || SOC_MT7621
	help
	  Enables support for the on-chip xHCI controller on MediaTek SoCs.

config USB_XHCI_MVEBU
	bool "MVEBU USB 3.0 support"
	default y
	depends on ARCH_MVEBU
	select DM_REGULATOR
	help
	  Choose this option to add support for USB 3.0 driver on mvebu
	  SoCs, which includes Armada8K, Armada3700 and other Armada
	  family SoCs.

config USB_XHCI_OCTEON
	bool "Support for Marvell Octeon family on-chip xHCI USB controller"
	depends on ARCH_OCTEON
	default y
	help
	  Enables support for the on-chip xHCI controller on Marvell Octeon
	  family SoCs. This is a driver for the dwc3 to provide the glue logic
	  to configure the controller.

config USB_XHCI_OMAP
	bool "Support for TI OMAP family xHCI USB controller"
	depends on ARCH_OMAP2PLUS
	help
	  Enables support for the on-chip xHCI controller found on some TI SoC
	  families.  Note that some families have multiple contollers while
	  others only have something such as DesignWare-based controllers.
	  Consult the SoC documentation to determine if this option applies
	  to your hardware.

config USB_XHCI_PCI
	bool "Support for PCI-based xHCI USB controller"
	depends on DM_USB && PCI
	default y if X86
	help
	  Enables support for the PCI-based xHCI controller.

config USB_XHCI_RCAR
	bool "Renesas RCar USB 3.0 support"
	default y
	depends on ARCH_RMOBILE
	help
	  Choose this option to add support for USB 3.0 driver on Renesas
	  RCar Gen3 SoCs.

config USB_XHCI_STI
	bool "Support for STMicroelectronics STiH407 family on-chip xHCI USB controller"
	depends on ARCH_STI
	default y
	help
	  Enables support for the on-chip xHCI controller on STMicroelectronics
	  STiH407 family SoCs. This is a driver for the dwc3 to provide the glue logic
	  to configure the controller.

config USB_XHCI_DRA7XX_INDEX
	int "DRA7XX xHCI USB index"
	range 0 1
	default 0
	depends on DRA7XX
	help
	  Select the DRA7XX xHCI USB index.
	  Current supported values: 0, 1.

config USB_XHCI_FSL
	bool "Support for NXP Layerscape on-chip xHCI USB controller"
	default y if ARCH_LS1021A || FSL_LSCH3 || FSL_LSCH2
	depends on !SPL_NO_USB
	help
	  Enables support for the on-chip xHCI controller on NXP Layerscape SoCs.

config USB_XHCI_BRCM
	bool "Broadcom USB3 Host XHCI controller"
	depends on DM_USB
	help
	  USB controller based on the Broadcom USB3 IP Core.
	  Supports USB2/3 functionality.

endif # USB_XHCI_HCD

config EHCI_DESC_BIG_ENDIAN
	bool

config EHCI_MMIO_BIG_ENDIAN
	bool

config USB_EHCI_HCD
	bool "EHCI HCD (USB 2.0) support"
	default y if ARCH_MX5 || ARCH_MX6
	depends on DM && OF_CONTROL
	select USB_HOST
	select EHCI_DESC_BIG_ENDIAN if SYS_BIG_ENDIAN
	select EHCI_MMIO_BIG_ENDIAN if SYS_BIG_ENDIAN
	---help---
	  The Enhanced Host Controller Interface (EHCI) is standard for USB 2.0
	  "high speed" (480 Mbit/sec, 60 Mbyte/sec) host controller hardware.
	  If your USB host controller supports USB 2.0, you will likely want to
	  configure this Host Controller Driver.

	  EHCI controllers are packaged with "companion" host controllers (OHCI
	  or UHCI) to handle USB 1.1 devices connected to root hub ports.  Ports
	  will connect to EHCI if the device is high speed, otherwise they
	  connect to a companion controller.  If you configure EHCI, you should
	  probably configure the OHCI (for NEC and some other vendors) USB Host
	  Controller Driver or UHCI (for Via motherboards) Host Controller
	  Driver too.

	  You may want to read <file:Documentation/usb/ehci.txt>.

if USB_EHCI_HCD

config USB_EHCI_IS_TDI
	bool

config USB_EHCI_ATMEL
	bool  "Support for Atmel on-chip EHCI USB controller"
	depends on ARCH_AT91
	default y
	---help---
	  Enables support for the on-chip EHCI controller on Atmel chips.

config USB_EHCI_EXYNOS
	bool "Support for Samsung Exynos EHCI USB controller"
	depends on ARCH_EXYNOS
	default y
	---help---
	  Enables support for the on-chip EHCI controller on Samsung Exynos
	  SoCs.

config USB_EHCI_MARVELL
	bool "Support for Marvell on-chip EHCI USB controller"
	depends on ARCH_MVEBU || ARCH_KIRKWOOD || ARCH_ORION5X
	default y
	select USB_EHCI_IS_TDI if !ARM64
	select USB_EHCI_IS_TDI if ALLEYCAT_5
	---help---
	  Enables support for the on-chip EHCI controller on MVEBU SoCs.

config USB_EHCI_MX5
	bool "Support for i.MX5 on-chip EHCI USB controller"
	depends on ARCH_MX5
	help
	  Enables support for the on-chip EHCI controller on i.MX5 SoCs.

config USB_EHCI_MX6
	bool "Support for i.MX6/i.MX7ULP on-chip EHCI USB controller"
	depends on ARCH_MX6 || ARCH_MX7ULP || ARCH_IMXRT
	select EHCI_HCD_INIT_AFTER_RESET
	default y
	---help---
	  Enables support for the on-chip EHCI controller on i.MX6 SoCs.

config USB_EHCI_MX7
	bool "Support for i.MX7 on-chip EHCI USB controller"
	depends on ARCH_MX7 || IMX8M
	select EHCI_HCD_INIT_AFTER_RESET if ARCH_MX7
	select PHY if IMX8M
	select NOP_PHY if IMX8M
	default y
	---help---
	  Enables support for the on-chip EHCI controller on i.MX7 SoCs.

config USB_EHCI_MXS
	bool "Support for i.MX23/i.MX28 EHCI USB controller"
	depends on ARCH_MX23 || ARCH_MX28
	default y
	select USB_EHCI_IS_TDI
	help
	  Enables support for the on-chip EHCI controller on i.MX23 and
	  i.MX28 SoCs.

config USB_EHCI_NPCM
	bool "Support for Nuvoton NPCM on-chip EHCI USB controller"
	depends on ARCH_NPCM
	---help---
	  Enables support for the on-chip EHCI controller on
	  Nuvoton NPCM chips.

config USB_EHCI_OMAP
	bool "Support for OMAP3+ on-chip EHCI USB controller"
	depends on ARCH_OMAP2PLUS
	select PHY
	imply NOP_PHY
	default y
	---help---
	  Enables support for the on-chip EHCI controller on OMAP3 and later
	  SoCs.

config USB_EHCI_VF
	bool "Support for Vybrid on-chip EHCI USB controller"
	depends on ARCH_VF610
	default y
	help
	  Enables support for the on-chip EHCI controller on Vybrid SoCs.

if USB_EHCI_MX6 || USB_EHCI_MX7

config MXC_USB_OTG_HACTIVE
	bool "USB Power pin high active"
	---help---
	  Set the USB Power pin polarity to be high active (PWR_POL)

endif

config USB_EHCI_MSM
	bool "Support for Qualcomm on-chip EHCI USB controller"
	depends on DM_USB
	select USB_ULPI_VIEWPORT
	select MSM8916_USB_PHY
	---help---
	  Enables support for the on-chip EHCI controller on Qualcomm
	  Snapdragon SoCs.

config USB_EHCI_PCI
	bool "Support for PCI-based EHCI USB controller"
	default y if X86
	help
	  Enables support for the PCI-based EHCI controller.

config USB_EHCI_TEGRA
	bool "Support for NVIDIA Tegra on-chip EHCI USB controller"
	depends on ARCH_TEGRA
	select USB_EHCI_IS_TDI
	---help---
	  Enable support for Tegra on-chip EHCI USB controller

config USB_EHCI_ZYNQ
	bool "Support for Xilinx Zynq on-chip EHCI USB controller"
	default y if ARCH_ZYNQ
	select USB_EHCI_IS_TDI
	---help---
	  Enable support for Zynq on-chip EHCI USB controller

config USB_EHCI_GENERIC
	bool "Support for generic EHCI USB controller"
	depends on DM_USB
	default ARCH_SUNXI
	---help---
	  Enables support for generic EHCI controller.

config EHCI_HCD_INIT_AFTER_RESET
	bool

config USB_EHCI_FSL
	bool  "Support for FSL on-chip EHCI USB controller"
	select EHCI_HCD_INIT_AFTER_RESET
	select SYS_FSL_USB_INTERNAL_UTMI_PHY if MPC85xx && \
		!(ARCH_B4860 || ARCH_B4420 || ARCH_P4080 || ARCH_P1020 || ARCH_P2020)
	---help---
	  Enables support for the on-chip EHCI controller on FSL chips.

config SYS_FSL_USB_INTERNAL_UTMI_PHY
	bool
	depends on USB_EHCI_FSL

config USB_EHCI_TXFIFO_THRESH
	hex
	depends on USB_EHCI_TEGRA
	default 0x10
	help
	  This parameter affects a TXFILLTUNING field that controls how much
	  data is sent to the latency fifo before it is sent to the wire.
	  Without this parameter, the default (2) causes occasional Data Buffer
	  Errors in OUT packets depending on the buffer address and size.

endif # USB_EHCI_HCD

config USB_OHCI_NEW
	bool

config SYS_USB_OHCI_CPU_INIT
	bool

config USB_OHCI_HCD
	bool "OHCI HCD (USB 1.1) support"
	depends on DM && OF_CONTROL
	select USB_HOST
	select USB_OHCI_NEW
	---help---
	  The Open Host Controller Interface (OHCI) is a standard for accessing
	  USB 1.1 host controller hardware.  It does more in hardware than Intel's
	  UHCI specification.  If your USB host controller follows the OHCI spec,
	  say Y.  On most non-x86 systems, and on x86 hardware that's not using a
	  USB controller from Intel or VIA, this is appropriate.  If your host
	  controller doesn't use PCI, this is probably appropriate.  For a PCI
	  based system where you're not sure, the "lspci -v" entry will list the
	  right "prog-if" for your USB controller(s):  EHCI, OHCI, or UHCI.

if USB_OHCI_HCD

config USB_OHCI_PCI
	bool "Support for PCI-based OHCI USB controller"
	depends on PCI
	help
	  Enables support for the PCI-based OHCI controller.

config USB_OHCI_GENERIC
	bool "Support for generic OHCI USB controller"
	default ARCH_SUNXI
	---help---
	  Enables support for generic OHCI controller.

config USB_OHCI_DA8XX
	bool "Support for da850 OHCI USB controller"
	help
	  Enable support for the da850 USB controller.

config USB_OHCI_NPCM
	bool "Support for Nuvoton NPCM on-chip OHCI USB controller"
	depends on ARCH_NPCM
	---help---
	  Enables support for the on-chip OHCI controller on
	  Nuvoton NPCM chips.

endif # USB_OHCI_HCD

config SYS_USB_OHCI_SLOT_NAME
	string "Display name for the OHCI controller"
	depends on USB_OHCI_NEW && !DM_USB

config SYS_OHCI_SWAP_REG_ACCESS
	bool "Perform byte swapping on OHCI controller register accesses"
	depends on USB_OHCI_NEW

config USB_UHCI_HCD
	bool "UHCI HCD (most Intel and VIA) support"
	select USB_HOST
	---help---
	  The Universal Host Controller Interface is a standard by Intel for
	  accessing the USB hardware in the PC (which is also called the USB
	  host controller). If your USB host controller conforms to this
	  standard, you may want to say Y, but see below. All recent boards
	  with Intel PCI chipsets (like intel 430TX, 440FX, 440LX, 440BX,
	  i810, i820) conform to this standard. Also all VIA PCI chipsets
	  (like VIA VP2, VP3, MVP3, Apollo Pro, Apollo Pro II or Apollo Pro
	  133) and LEON/GRLIB SoCs with the GRUSBHC controller.
	  If unsure, say Y.

if USB_UHCI_HCD

endif # USB_UHCI_HCD

config USB_DWC2
	bool "DesignWare USB2 Core support"
	depends on DM && OF_CONTROL
	select USB_HOST
	---help---
	  The DesignWare USB 2.0 controller is compliant with the
	  USB-Implementers Forum (USB-IF) USB 2.0 specifications.
	  Hi-Speed (480 Mbps), Full-Speed (12 Mbps), and Low-Speed (1.5 Mbps)
	  operation is compliant to the controller Supplement. If you want to
	  enable this controller in host mode, say Y.

if USB_DWC2
config USB_DWC2_BUFFER_SIZE
	int "Data buffer size in kB"
	default 64
	---help---
	  By default 64 kB buffer is used but if amount of RAM avaialble on
	  the target is not enough to accommodate allocation of buffer of
	  that size it is possible to shrink it. Smaller sizes should be fine
	  because larger transactions could be split in smaller ones.

endif # USB_DWC2

config USB_R8A66597_HCD
	bool "Renesas R8A66597 USB Core support"
	depends on DM && OF_CONTROL
	select USB_HOST
	---help---
	  This enables support for the on-chip Renesas R8A66597 USB 2.0
	  controller, present in various RZ and SH SoCs.

config USB_ATMEL
	bool "AT91 OHCI USB support"
	depends on ARCH_AT91
	select SYS_USB_OHCI_CPU_INIT
	select USB_OHCI_NEW

choice
	prompt "Clock for OHCI"
	depends on USB_ATMEL

config USB_ATMEL_CLK_SEL_PLLB
	bool "PLLB"

config USB_ATMEL_CLK_SEL_UPLL
	bool "UPLL"

endchoice

config USB_OHCI_LPC32XX
	bool "LPC32xx USB OHCI support"
	depends on ARCH_LPC32XX
	select SYS_USB_OHCI_CPU_INIT
	select USB_OHCI_NEW

config USB_MAX_CONTROLLER_COUNT
	int "Maximum number of USB host controllers"
	depends on USB_EHCI_FSL || USB_XHCI_FSL || \
		(SPL_USB_HOST && !DM_SPL_USB) || (USB_HOST && !DM_USB)
	default 1
