# SPDX-License-Identifier: GPL-2.0-only
#
# PTP clock support configuration
#

menu "PTP clock support"

config PTP_1588_CLOCK
	tristate "PTP clock support"
	depends on NET && POSIX_TIMERS
	default ETHERNET
	select PPS
	select NET_PTP_CLASSIFY
	help
	  The IEEE 1588 standard defines a method to precisely
	  synchronize distributed clocks over Ethernet networks. The
	  standard defines a Precision Time Protocol (PTP), which can
	  be used to achieve synchronization within a few dozen
	  microseconds. In addition, with the help of special hardware
	  time stamping units, it can be possible to achieve
	  synchronization to within a few hundred nanoseconds.

	  This driver adds support for PTP clocks as character
	  devices. If you want to use a PTP clock, then you should
	  also enable at least one clock driver as well.

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

config PTP_1588_CLOCK_OPTIONAL
	tristate
	default y if PTP_1588_CLOCK=n
	default PTP_1588_CLOCK
	help
	  Drivers that can optionally use the PTP_1588_CLOCK framework
	  should depend on this symbol to prevent them from being built
	  into vmlinux while the PTP support itself is in a loadable
	  module.
	  If PTP support is disabled, this dependency will still be
	  met, and drivers refer to dummy helpers.

config PTP_1588_CLOCK_DTE
	tristate "Broadcom DTE as PTP clock"
	depends on PTP_1588_CLOCK
	depends on NET && HAS_IOMEM
	depends on ARCH_BCM_MOBILE || (ARCH_BCM_IPROC && !(ARCH_BCM_NSP || ARCH_BCM_5301X)) || COMPILE_TEST
	default y
	help
	  This driver adds support for using the Digital timing engine
	  (DTE) in the Broadcom SoC's as a PTP clock.

	  The clock can be used in both wired and wireless networks
	  for PTP purposes.

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

config PTP_1588_CLOCK_QORIQ
	tristate "Freescale QorIQ 1588 timer as PTP clock"
	depends on GIANFAR || FSL_DPAA_ETH || FSL_DPAA2_ETH || FSL_ENETC || FSL_ENETC_VF || COMPILE_TEST
	depends on PTP_1588_CLOCK
	default y
	help
	  This driver adds support for using the Freescale QorIQ 1588
	  timer as a PTP clock. This clock is only useful if your PTP
	  programs are getting hardware time stamps on the PTP Ethernet
	  packets using the SO_TIMESTAMPING API.

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

comment "Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks."
	depends on PHYLIB=n || NETWORK_PHY_TIMESTAMPING=n

config DP83640_PHY
	tristate "Driver for the National Semiconductor DP83640 PHYTER"
	depends on NETWORK_PHY_TIMESTAMPING
	depends on PHYLIB
	depends on PTP_1588_CLOCK
	select CRC32
	help
	  Supports the DP83640 PHYTER with IEEE 1588 features.

	  This driver adds support for using the DP83640 as a PTP
	  clock. This clock is only useful if your PTP programs are
	  getting hardware time stamps on the PTP Ethernet packets
	  using the SO_TIMESTAMPING API.

	  In order for this to work, your MAC driver must also
	  implement the skb_tx_timestamp() function.

config PTP_1588_CLOCK_INES
	tristate "ZHAW InES PTP time stamping IP core"
	depends on NETWORK_PHY_TIMESTAMPING
	depends on HAS_IOMEM
	depends on PHYLIB
	depends on PTP_1588_CLOCK
	help
	  This driver adds support for using the ZHAW InES 1588 IP
	  core.  This clock is only useful if the MII bus of your MAC
	  is wired up to the core.

config PTP_1588_CLOCK_PCH
	tristate "Intel PCH EG20T as PTP clock"
	depends on MIPS_GENERIC || X86_32 || COMPILE_TEST
	depends on HAS_IOMEM && PCI
	depends on NET
	depends on PTP_1588_CLOCK
	help
	  This driver adds support for using the PCH EG20T as a PTP
	  clock. The hardware supports time stamping of PTP packets
	  when using the end-to-end delay (E2E) mechanism. The peer
	  delay mechanism (P2P) is not supported.

	  This clock is only useful if your PTP programs are getting
	  hardware time stamps on the PTP Ethernet packets using the
	  SO_TIMESTAMPING API.

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

config PTP_1588_CLOCK_KVM
	tristate "KVM virtual PTP clock"
	depends on PTP_1588_CLOCK
	depends on (KVM_GUEST && X86) || (HAVE_ARM_SMCCC_DISCOVERY && ARM_ARCH_TIMER)
	default y
	help
	  This driver adds support for using kvm infrastructure as a PTP
	  clock. This clock is only useful if you are using KVM guests.

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

config PTP_1588_CLOCK_IDT82P33
	tristate "IDT 82P33xxx PTP clock"
	depends on PTP_1588_CLOCK && I2C
	default n
	help
	  This driver adds support for using the IDT 82P33xxx as a PTP
	  clock. This clock is only useful if your time stamping MAC
	  is connected to the IDT chip.

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

config PTP_1588_CLOCK_IDTCM
	tristate "IDT CLOCKMATRIX as PTP clock"
	depends on PTP_1588_CLOCK && I2C
	default n
	help
	  This driver adds support for using IDT CLOCKMATRIX(TM) as a PTP
	  clock. This clock is only useful if your time stamping MAC
	  is connected to the IDT chip.

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

config PTP_1588_CLOCK_FC3W
	tristate "RENESAS FemtoClock3 Wireless as PTP clock"
	depends on PTP_1588_CLOCK && I2C
	default n
	help
	  This driver adds support for using Renesas FemtoClock3 Wireless
	  as a PTP clock. This clock is only useful if your time stamping
	  MAC is connected to the RENESAS chip.

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

config PTP_1588_CLOCK_MOCK
	tristate "Mock-up PTP clock"
	depends on PTP_1588_CLOCK
	help
	  This driver offers a set of PTP clock manipulation operations over
	  the system monotonic time. It can be used by virtual network device
	  drivers to emulate PTP capabilities.

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

config PTP_1588_CLOCK_VMW
	tristate "VMware virtual PTP clock"
	depends on ACPI && HYPERVISOR_GUEST && X86
	depends on PTP_1588_CLOCK
	help
	  This driver adds support for using VMware virtual precision
	  clock device as a PTP clock. This is only useful in virtual
	  machines running on VMware virtual infrastructure.

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

config PTP_1588_CLOCK_OCP
	tristate "OpenCompute TimeCard as PTP clock"
	depends on PTP_1588_CLOCK
	depends on HAS_IOMEM && PCI
	depends on I2C && MTD
	depends on SERIAL_8250
	depends on !S390
	depends on COMMON_CLK
	select NET_DEVLINK
	select CRC16
	select DPLL
	help
	  This driver adds support for an OpenCompute time card.

	  The OpenCompute time card is an atomic clock along with
	  a GPS receiver that provides a Grandmaster clock source
	  for a PTP enabled network.

	  More information is available at http://www.timingcard.com/

config PTP_DFL_TOD
	tristate "FPGA DFL ToD Driver"
	depends on FPGA_DFL
	depends on PTP_1588_CLOCK
	help
	  The DFL (Device Feature List) device driver for the Intel ToD
	  (Time-of-Day) device in FPGA card. The ToD IP within the FPGA
	  is exposed as PTP Hardware Clock (PHC) device to the Linux PTP
	  stack to synchronize the system clock to its ToD information
	  using phc2sys utility of the Linux PTP stack.

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

endmenu
