# 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 MDIO_BUS
	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 && MDIO_BUS)
	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
