# SPDX-License-Identifier: GPL-2.0-only
#
# Phy drivers for Broadcom platforms
#
menu "PHY drivers for Broadcom platforms"

config PHY_BCM63XX_USBH
	tristate "BCM63xx USBH PHY driver"
	depends on BMIPS_GENERIC || COMPILE_TEST
	select GENERIC_PHY
	help
	  Enable this to support the BCM63xx USBH PHY driver.
	  If unsure, say N.

config PHY_CYGNUS_PCIE
	tristate "Broadcom Cygnus PCIe PHY driver"
	depends on OF && (ARCH_BCM_CYGNUS || COMPILE_TEST)
	select GENERIC_PHY
	default ARCH_BCM_CYGNUS
	help
	  Enable this to support the Broadcom Cygnus PCIe PHY.
	  If unsure, say N.

config PHY_BCM_SR_USB
	tristate "Broadcom Stingray USB PHY driver"
	depends on OF && (ARCH_BCM_IPROC || COMPILE_TEST)
	select GENERIC_PHY
	default ARCH_BCM_IPROC
	help
	  Enable this to support the Broadcom Stingray USB PHY
	  driver. It supports all versions of Superspeed and
	  Highspeed PHYs.
	  If unsure, say N.

config BCM_KONA_USB2_PHY
	tristate "Broadcom Kona USB2 PHY Driver"
	depends on HAS_IOMEM
	select GENERIC_PHY
	help
	  Enable this to support the Broadcom Kona USB 2.0 PHY.

config PHY_BCM_NS_USB2
	tristate "Broadcom Northstar USB 2.0 PHY Driver"
	depends on ARCH_BCM_IPROC || COMPILE_TEST
	depends on HAS_IOMEM && OF
	select GENERIC_PHY
	help
	  Enable this to support Broadcom USB 2.0 PHY connected to the USB
	  controller on Northstar family.

config PHY_BCM_NS_USB3
	tristate "Broadcom Northstar USB 3.0 PHY Driver"
	depends on ARCH_BCM_IPROC || COMPILE_TEST
	depends on HAS_IOMEM && OF
	depends on PHYLIB
	select GENERIC_PHY
	help
	  Enable this to support Broadcom USB 3.0 PHY connected to the USB
	  controller on Northstar family.

config PHY_NS2_PCIE
	tristate "Broadcom Northstar2 PCIe PHY driver"
	depends on (OF && MDIO_BUS_MUX_BCM_IPROC) || (COMPILE_TEST && PHYLIB)
	select GENERIC_PHY
	default ARCH_BCM_IPROC
	help
	  Enable this to support the Broadcom Northstar2 PCIe PHY.
	  If unsure, say N.

config PHY_NS2_USB_DRD
	tristate "Broadcom Northstar2 USB DRD PHY support"
	depends on OF && (ARCH_BCM_IPROC || COMPILE_TEST)
	select GENERIC_PHY
	select EXTCON
	default ARCH_BCM_IPROC
	help
	  Enable this to support the Broadcom Northstar2 USB DRD PHY.
	  This driver initializes the PHY in either HOST or DEVICE mode.
	  The host or device configuration is read from device tree.

	  If unsure, say N.

config PHY_BRCM_SATA
	tristate "Broadcom SATA PHY driver"
	depends on ARCH_BRCMSTB || ARCH_BCM_IPROC || BMIPS_GENERIC || \
		   ARCH_BCMBCA || COMPILE_TEST
	depends on OF
	select GENERIC_PHY
	default ARCH_BCM_IPROC
	help
	  Enable this to support the Broadcom SATA PHY.
	  If unsure, say N.

config PHY_BRCM_USB
	tristate "Broadcom STB USB PHY driver"
	depends on ARCH_BCMBCA || ARCH_BRCMSTB || COMPILE_TEST
	depends on OF
	select GENERIC_PHY
	select SOC_BRCMSTB if ARCH_BRCMSTB
	default ARCH_BCMBCA || ARCH_BRCMSTB
	help
	  Enable this to support the Broadcom STB USB PHY.
	  This driver is required by the USB XHCI, EHCI and OHCI
	  drivers.
	  If unsure, say N.

config PHY_BCM_SR_PCIE
	tristate "Broadcom Stingray PCIe PHY driver"
	depends on OF && (ARCH_BCM_IPROC || COMPILE_TEST)
	select GENERIC_PHY
	select MFD_SYSCON
	default ARCH_BCM_IPROC
	help
	  Enable this to support the Broadcom Stingray PCIe PHY
	  If unsure, say N.

endmenu
