# SPDX-License-Identifier: GPL-2.0-only
#
# TI device configuration
#

config NET_VENDOR_TI
	bool "Texas Instruments (TI) devices"
	default y
	depends on PCI || EISA || AR7 || ARCH_DAVINCI || ARCH_OMAP2PLUS || ARCH_KEYSTONE || ARCH_K3
	help
	  If you have a network (Ethernet) card belonging to this class, say Y.

	  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 ) || COMPILE_TEST
	select TI_DAVINCI_MDIO
	select PHYLIB
	select GENERIC_ALLOCATOR
	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 ARCH_DAVINCI || ARCH_OMAP2PLUS || ARCH_KEYSTONE || ARCH_K3 || COMPILE_TEST
	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_CPSW_PHY_SEL
	bool "TI CPSW Phy mode Selection (DEPRECATED)"
	default n
	help
	  This driver supports configuring of the phy mode connected to
	  the CPSW. DEPRECATED: use PHY_TI_GMII_SEL.

config TI_CPSW
	tristate "TI CPSW Switch Support"
	depends on ARCH_DAVINCI || ARCH_OMAP2PLUS || COMPILE_TEST
	depends on TI_CPTS || !TI_CPTS
	select TI_DAVINCI_MDIO
	select MFD_SYSCON
	select PAGE_POOL
	select REGMAP
	imply PHY_TI_GMII_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_CPSW_SWITCHDEV
	tristate "TI CPSW Switch Support with switchdev"
	depends on ARCH_DAVINCI || ARCH_OMAP2PLUS || COMPILE_TEST
	depends on NET_SWITCHDEV
	depends on TI_CPTS || !TI_CPTS
	select PAGE_POOL
	select TI_DAVINCI_MDIO
	select MFD_SYSCON
	select REGMAP
	select NET_DEVLINK
	imply PHY_TI_GMII_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_new.

config TI_CPTS
	tristate "TI Common Platform Time Sync (CPTS) Support"
	depends on ARCH_OMAP2PLUS || ARCH_KEYSTONE || COMPILE_TEST
	depends on COMMON_CLK
	depends on PTP_1588_CLOCK
	help
	  This driver supports the Common Platform Time Sync unit of
	  the CPSW Ethernet Switch and Keystone 2 1g/10g Switch Subsystem.
	  The unit can time stamp PTP UDP/IPv4 and Layer 2 packets, and the
	  driver offers a PTP Hardware Clock.

config TI_K3_AM65_CPSW_NUSS
	tristate "TI K3 AM654x/J721E CPSW Ethernet driver"
	depends on ARCH_K3 && OF && TI_K3_UDMA_GLUE_LAYER
	select NET_DEVLINK
	select TI_DAVINCI_MDIO
	imply PHY_TI_GMII_SEL
	depends on TI_K3_AM65_CPTS || !TI_K3_AM65_CPTS
	help
	  This driver supports TI K3 AM654/J721E CPSW2G Ethernet SubSystem.
	  The two-port Gigabit Ethernet MAC (MCU_CPSW0) subsystem provides
	  Ethernet packet communication for the device: One Ethernet port
	  (port 1) with selectable RGMII and RMII interfaces and an internal
	  Communications Port Programming Interface (CPPI) port (port 0).

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

config TI_K3_AM65_CPSW_SWITCHDEV
	bool "TI K3 AM654x/J721E CPSW Switch mode support"
	depends on TI_K3_AM65_CPSW_NUSS
	depends on NET_SWITCHDEV
	help
	 This enables switchdev support for TI K3 CPSWxG Ethernet
	 Switch. Enable this driver to support hardware switch support for AM65
	 CPSW NUSS driver.

config TI_K3_AM65_CPTS
	tristate "TI K3 AM65x CPTS"
	depends on ARCH_K3 && OF
	depends on PTP_1588_CLOCK
	help
	  Say y here to support the TI K3 AM65x CPTS with 1588 features such as
	  PTP hardware clock for each CPTS device and network packets
	  timestamping where applicable.
	  Depending on integration CPTS blocks enable compliance with
	  the IEEE 1588-2008 standard for a precision clock synchronization
	  protocol, Ethernet Enhanced Scheduled Traffic Operations (CPTS_ESTFn)
	  and PCIe Subsystem Precision Time Measurement (PTM).

config TI_AM65_CPSW_TAS
	bool "Enable TAS offload in AM65 CPSW"
	depends on TI_K3_AM65_CPSW_NUSS && NET_SCH_TAPRIO && TI_K3_AM65_CPTS
	help
	  Say y here to support Time Aware Shaper(TAS) offload in AM65 CPSW.
	  AM65 CPSW hardware supports Enhanced Scheduled Traffic (EST)
	  defined in IEEE 802.1Q 2018. The EST scheduler runs on CPTS and the
	  TAS/EST schedule is updated in the Fetch RAM memory of the CPSW.

config TI_KEYSTONE_NETCP
	tristate "TI Keystone NETCP Core Support"
	select TI_DAVINCI_MDIO
	depends on OF
	depends on KEYSTONE_NAVIGATOR_DMA && KEYSTONE_NAVIGATOR_QMSS
	depends on TI_CPTS || !TI_CPTS
	help
	  This driver supports TI's Keystone NETCP Core.

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

config TI_KEYSTONE_NETCP_ETHSS
	depends on TI_KEYSTONE_NETCP
	tristate "TI Keystone NETCP Ethernet subsystem Support"
	help

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

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 here.

	  Devices currently supported by this driver are Compaq Netelligent,
	  Compaq NetFlex and Olicom cards.  Please read the file
	  <file:Documentation/networking/device_drivers/ethernet/ti/tlan.rst>
	  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
