##
## Copyright (C) 2008 Advanced Micro Devices, Inc.
## Copyright (C) 2008 coresystems GmbH
##
## Redistribution and use in source and binary forms, with or without
## modification, are permitted provided that the following conditions
## are met:
## 1. Redistributions of source code must retain the above copyright
##    notice, this list of conditions and the following disclaimer.
## 2. Redistributions in binary form must reproduce the above copyright
##    notice, this list of conditions and the following disclaimer in the
##    documentation and/or other materials provided with the distribution.
## 3. The name of the author may not be used to endorse or promote products
##    derived from this software without specific prior written permission.
##
## THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
## ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
## IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
## ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
## FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
## DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
## OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
## HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
## LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
## OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
## SUCH DAMAGE.
##

menu "Console Options"

config SERIAL_SET_SPEED
	bool "Override the serial console baud rate"
	default n
	depends on DRIVER_CONSOLE_UART

config SERIAL_BAUD_RATE
	int "Serial console baud rate (default 115200)"
	depends on SERIAL_SET_SPEED
	default 115200

endmenu

menu "Drivers"

config PCI
	bool "Support for PCI devices"
	depends on ARCH_X86 # for now
	default y

config USB
	bool "USB Support"
	default n

config USB_UHCI
	bool "Support for USB UHCI controllers"
	default n
	depends on USB && ARCH_X86
	help
	  Select this option if you are going to use USB 1.1 on an Intel based
	  system.

config USB_OHCI
	bool "Support for USB OHCI controllers"
	default n
	depends on USB
	help
	  Select this option if you are going to use USB 1.1 on a non-Intel based
	  system.

config USB_EHCI
	bool "Support for USB EHCI controllers"
	default n
	depends on USB
	help
	  Select this option if you want to use USB 2.0

config USB_XHCI
	bool "Support for USB xHCI controllers"
	default n
	depends on USB
	help
	  Select this option if you want to use USB 3.0
	  NOTE: This option is not (fully) implemented yet

config USB_XHCI_MTK_QUIRK
	bool "Support for USB xHCI controllers on MTK SoC"
	depends on USB_XHCI
	default n
	help
	  Select this option if you want to use USB 3.0 on MTK platform.

config USB_DWC2
	bool "Support for USB DesignWare HCD controllers"
	depends on USB
	default n
	help
	  Select this option if you want to use DesignWare USB 2.0 host controller

config USB_HUB
	bool "Support for USB hubs"
	depends on USB
	default y
	help
	  Select this option if you want to compile in support for USB hubs.
	  Say Y here unless you know exactly what you are doing.

config USB_EHCI_HOSTPC_ROOT_HUB_TT
	bool "Support for USB EHCI ROOT HUB that has TT"
	depends on USB_EHCI
	default n
	help
	  Select this option if USB EHCI root hub supports TT (Transaction
	  Translator).
	  To support this TT feature we read port-speed from non-standard
	  register HOSTPC (offset 84h of Operational Register base).

config USB_MSC
	bool "Support for USB storage"
	depends on USB
	default y
	help
	  Select this option if you want to compile in support for USB mass
	  storage devices (USB memory sticks, hard drives, CDROM/DVD drives)
	  Say Y here unless you know exactly what you are doing.

config USB_GEN_HUB
	bool
	default n if (!USB_HUB && !USB_XHCI)
	default y if (USB_HUB || USB_XHCI)

config USB_PCI
	bool "Auto-scan PCI bus for USB host controllers"
	depends on USB
	default y if ARCH_X86
	default n

config UDC
	bool "USB device mode support"
	default n
	help
	  Select this option to add support for running as
	  a USB device.

config UDC_CI
	bool "ChipIdea driver for USB device mode"
	depends on UDC
	default n
	help
	  Select this option to add the driver for ChipIdea
	  USB device controller.

config UDC_DWC2
	bool "Designware driver for USB device mode"
	depends on UDC
	default n
	help
	  Select this option to add the driver for Designware
	  USB device controller.

endmenu

menu "Debugging"

config DEBUG_MALLOC
	bool "Debug memory allocator"
	depends on USB
	default n
	help
	  Select this option if you want to debug the memory allocator. This
	  option logs all uses of the following functions:

	    void free(void *ptr);
	    void *malloc(size_t size);
	    void *calloc(size_t nmemb, size_t size);
	    void *realloc(void *ptr, size_t size);
	    void *memalign(size_t align, size_t size);

	  Say N here unless you are debugging memory allocator problems.

endmenu
