#
# TI device configuration
#

config NET_VENDOR_TI
	bool "Texas Instruments (TI) devices"
	default y
	depends on PCI || EISA || AR7 || (ARM && (ARCH_DAVINCI || ARCH_OMAP3 || SOC_AM33XX))
	---help---
	  If you have a network (Ethernet) card belonging to this class, say Y
	  and read the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  Note that the answer to this question doesn't directly affect the
	  kernel: saying N will just cause the configurator to skip all
	  the questions about TI devices. If you say Y, you will be asked for
	  your specific card in the following questions.

if NET_VENDOR_TI

config TI_DAVINCI_EMAC
	tristate "TI DaVinci EMAC Support"
	depends on ARM && ( ARCH_DAVINCI || ARCH_OMAP3 )
	select TI_DAVINCI_MDIO
	select TI_DAVINCI_CPDMA
	select PHYLIB
	---help---
	  This driver supports TI's DaVinci Ethernet .

	  To compile this driver as a module, choose M here: the module
	  will be called davinci_emac_driver.  This is recommended.

config TI_DAVINCI_MDIO
	tristate "TI DaVinci MDIO Support"
	depends on ARM && ( ARCH_DAVINCI || ARCH_OMAP3 || SOC_AM33XX )
	select PHYLIB
	---help---
	  This driver supports TI's DaVinci MDIO module.

	  To compile this driver as a module, choose M here: the module
	  will be called davinci_mdio.  This is recommended.

config TI_DAVINCI_CPDMA
	tristate "TI DaVinci CPDMA Support"
	depends on ARM && ( ARCH_DAVINCI || ARCH_OMAP3 || SOC_AM33XX )
	---help---
	  This driver supports TI's DaVinci CPDMA dma engine.

	  To compile this driver as a module, choose M here: the module
	  will be called davinci_cpdma.  This is recommended.

config TI_CPSW_PHY_SEL
	boolean "TI CPSW Switch Phy sel Support"
	depends on TI_CPSW
	---help---
	  This driver supports configuring of the phy mode connected to
	  the CPSW.

config TI_CPSW
	tristate "TI CPSW Switch Support"
	depends on ARM && (ARCH_DAVINCI || SOC_AM33XX)
	select TI_DAVINCI_CPDMA
	select TI_DAVINCI_MDIO
	select TI_CPSW_PHY_SEL
	---help---
	  This driver supports TI's CPSW Ethernet Switch.

	  To compile this driver as a module, choose M here: the module
	  will be called cpsw.

config TI_CPTS
	boolean "TI Common Platform Time Sync (CPTS) Support"
	depends on TI_CPSW
	select PTP_1588_CLOCK
	---help---
	  This driver supports the Common Platform Time Sync unit of
	  the CPSW Ethernet Switch. The unit can time stamp PTP UDP/IPv4
	  and Layer 2 packets, and the driver offers a PTP Hardware Clock.

config TLAN
	tristate "TI ThunderLAN support"
	depends on (PCI || EISA)
	---help---
	  If you have a PCI Ethernet network card based on the ThunderLAN chip
	  which is supported by this driver, say Y and read the
	  Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  Devices currently supported by this driver are Compaq Netelligent,
	  Compaq NetFlex and Olicom cards.  Please read the file
	  <file:Documentation/networking/tlan.txt> for more details.

	  To compile this driver as a module, choose M here. The module
	  will be called tlan.

	  Please email feedback to <torben.mathiasen@compaq.com>.

config CPMAC
	tristate "TI AR7 CPMAC Ethernet support"
	depends on AR7
	select PHYLIB
	---help---
	  TI AR7 CPMAC Ethernet support

endif # NET_VENDOR_TI
