# SPDX-License-Identifier: GPL-2.0-only
#
# Phy drivers for Qualcomm and Atheros platforms
#
config PHY_ATH79_USB
	tristate "Atheros AR71XX/9XXX USB PHY driver"
	depends on OF && (ATH79 || COMPILE_TEST)
	default y if USB_EHCI_HCD_PLATFORM || USB_OHCI_HCD_PLATFORM
	select RESET_CONTROLLER
	select GENERIC_PHY
	help
	  Enable this to support the USB PHY on Atheros AR71XX/9XXX SoCs.

config PHY_QCOM_APQ8064_SATA
	tristate "Qualcomm APQ8064 SATA SerDes/PHY driver"
	depends on ARCH_QCOM
	depends on HAS_IOMEM
	depends on OF
	select GENERIC_PHY

config PHY_QCOM_EDP
	tristate "Qualcomm eDP PHY driver"
	depends on ARCH_QCOM || COMPILE_TEST
	depends on OF
	depends on COMMON_CLK
	select GENERIC_PHY
	help
	  Enable this driver to support the Qualcomm eDP PHY found in various
	  Qualcomm chipsets.

config PHY_QCOM_IPQ4019_USB
	tristate "Qualcomm IPQ4019 USB PHY driver"
	depends on OF && (ARCH_QCOM || COMPILE_TEST)
	select GENERIC_PHY
	help
	  Support for the USB PHY-s on Qualcomm IPQ40xx SoC-s.

config PHY_QCOM_IPQ806X_SATA
	tristate "Qualcomm IPQ806x SATA SerDes/PHY driver"
	depends on ARCH_QCOM
	depends on HAS_IOMEM
	depends on OF
	select GENERIC_PHY

config PHY_QCOM_PCIE2
	tristate "Qualcomm PCIe Gen2 PHY Driver"
	depends on OF && COMMON_CLK && (ARCH_QCOM || COMPILE_TEST)
	select GENERIC_PHY
	help
	  Enable this to support the Qualcomm PCIe PHY, used with the Synopsys
	  based PCIe controller.

menuconfig PHY_QCOM_QMP
	tristate "Qualcomm QMP PHY Drivers"
	depends on OF && COMMON_CLK && (ARCH_QCOM || COMPILE_TEST)

if PHY_QCOM_QMP

config PHY_QCOM_QMP_COMBO
	tristate "Qualcomm QMP Combo PHY Driver"
	default PHY_QCOM_QMP
	depends on TYPEC || TYPEC=n
	depends on DRM || DRM=n
	select GENERIC_PHY
	select MFD_SYSCON
	select DRM_AUX_BRIDGE if DRM_BRIDGE
	help
	  Enable this to support the QMP Combo PHY transceiver that is used
	  with USB3 and DisplayPort controllers on Qualcomm chips.

config PHY_QCOM_QMP_PCIE
	tristate "Qualcomm QMP PCIe PHY Driver"
	depends on PCI || COMPILE_TEST
	select GENERIC_PHY
	default PHY_QCOM_QMP
	help
	  Enable this to support the QMP PCIe PHY transceiver that is used
	  with PCIe controllers on Qualcomm chips.

config PHY_QCOM_QMP_PCIE_MULTIPHY
	tristate "Qualcomm QMP PCIe Multi PHY Driver"
	depends on PCI || COMPILE_TEST
	select GENERIC_PHY
	help
	  Enable this to support the QMP PCIe PHY transceiver that is used
	  with PCIe controllers on Qualcomm chips. This PHY is a single
	  multi-lane QMP block that can be configured either as one wide
	  link or as multiple narrower independent links (bifurcation).

config PHY_QCOM_QMP_PCIE_8996
	tristate "Qualcomm QMP PCIe 8996 PHY Driver"
	depends on PCI || COMPILE_TEST
	select GENERIC_PHY
	default PHY_QCOM_QMP
	help
	  Enable this to support the QMP PCIe PHY transceiver that is used
	  with PCIe controllers on Qualcomm msm8996 chips.

config PHY_QCOM_QMP_UFS
	tristate "Qualcomm QMP UFS PHY Driver"
	select GENERIC_PHY
	default PHY_QCOM_QMP
	help
	  Enable this to support the QMP UFS PHY transceiver that is used
	  with UFS controllers on Qualcomm chips.

config PHY_QCOM_QMP_USB
	tristate "Qualcomm QMP USB PHY Driver"
	select GENERIC_PHY
	default PHY_QCOM_QMP
	help
	  Enable this to support the QMP USB PHY transceiver that is used
	  with USB3 controllers on Qualcomm chips.

config PHY_QCOM_QMP_USB_LEGACY
	tristate "Qualcomm QMP legacy USB PHY Driver"
	select GENERIC_PHY
	default n
	help
	  Enable this legacy driver to support the QMP USB+DisplayPort Combo
	  PHY transceivers working only in USB3 mode on Qualcomm chips. This
	  driver exists only for compatibility with older device trees,
	  existing users have been migrated to PHY_QCOM_QMP_COMBO driver.

endif # PHY_QCOM_QMP

config PHY_QCOM_QUSB2
	tristate "Qualcomm QUSB2 PHY Driver"
	depends on OF && (ARCH_QCOM || COMPILE_TEST)
	depends on NVMEM || !NVMEM
	select GENERIC_PHY
	help
	  Enable this to support the HighSpeed QUSB2 PHY transceiver for USB
	  controllers on Qualcomm chips. This driver supports the high-speed
	  PHY which is usually paired with either the ChipIdea or Synopsys DWC3
	  USB IPs on MSM SOCs.

config PHY_QCOM_EUSB2_REPEATER
	tristate "Qualcomm PMIC eUSB2 Repeater Driver"
	depends on OF && (ARCH_QCOM || COMPILE_TEST)
	select GENERIC_PHY
	help
	  Enable support for the USB high-speed eUSB2 repeater on Qualcomm
	  PMICs. The repeater is paired with a Synopsys or M31 eUSB2 Phy
	  on Qualcomm SOCs.

config PHY_QCOM_M31_USB
	tristate "Qualcomm M31 HS PHY driver support"
	depends on USB && (ARCH_QCOM || COMPILE_TEST)
	select GENERIC_PHY
	help
	  Enable this to support M31 HS PHY transceivers on Qualcomm chips
	  with DWC3 USB core. It handles PHY initialization, clock
	  management required after resetting the hardware and power
	  management. This driver is required even for peripheral only or
	  host only mode configurations.

config PHY_QCOM_UNIPHY_PCIE_28LP
	bool "PCIE UNIPHY 28LP PHY driver"
	depends on ARCH_QCOM
	depends on COMMON_CLK
	depends on HAS_IOMEM
	depends on OF
	select GENERIC_PHY
	help
	  Enable this to support the PCIe UNIPHY 28LP phy transceiver that
	  is used with PCIe controllers on Qualcomm IPQ5332 chips. It
	  handles PHY initialization, clock management required after
	  resetting the hardware and power management.

config PHY_QCOM_M31_EUSB
	tristate "Qualcomm M31 eUSB2 PHY driver support"
	depends on USB && (ARCH_QCOM || COMPILE_TEST)
	select GENERIC_PHY
	help
	  Enable this to support M31 EUSB2 PHY transceivers on Qualcomm
	  chips with DWC3 USB core. It supports initializing and cleaning
	  up of the associated USB repeater that is paired with the eUSB2
	  PHY.

config PHY_QCOM_USB_HS
	tristate "Qualcomm USB HS PHY module"
	depends on USB_ULPI_BUS
	depends on EXTCON || !EXTCON # if EXTCON=m, this cannot be built-in
	select GENERIC_PHY
	help
	  Support for the USB high-speed ULPI compliant phy on Qualcomm
	  chipsets.

config PHY_QCOM_USB_SNPS_FEMTO_V2
	tristate "Qualcomm SNPS FEMTO USB HS PHY V2 module"
	depends on OF && (ARCH_QCOM || COMPILE_TEST)
	select GENERIC_PHY
	help
	  Enable support for the USB high-speed SNPS Femto phy on Qualcomm
	  chipsets.  This PHY has differences in the register map compared
	  to the V1 variants.  The PHY is paired with a Synopsys DWC3 USB
	  controller on Qualcomm SOCs.

config PHY_QCOM_USB_HSIC
	tristate "Qualcomm USB HSIC ULPI PHY module"
	depends on USB_ULPI_BUS
	select GENERIC_PHY
	help
	  Support for the USB HSIC ULPI compliant PHY on QCOM chipsets.

config PHY_QCOM_USB_HS_28NM
	tristate "Qualcomm 28nm High-Speed PHY"
	depends on OF && (ARCH_QCOM || COMPILE_TEST)
	depends on EXTCON || !EXTCON # if EXTCON=m, this cannot be built-in
	select GENERIC_PHY
	help
	  Enable this to support the Qualcomm Synopsys DesignWare Core 28nm
	  High-Speed PHY driver. This driver supports the Hi-Speed PHY which
	  is usually paired with either the ChipIdea or Synopsys DWC3 USB
	  IPs on MSM SOCs.

config PHY_QCOM_USB_SS
	tristate "Qualcomm USB Super-Speed PHY driver"
	depends on OF && (ARCH_QCOM || COMPILE_TEST)
	depends on EXTCON || !EXTCON # if EXTCON=m, this cannot be built-in
	select GENERIC_PHY
	help
	  Enable this to support the Super-Speed USB transceiver on various
	  Qualcomm chipsets.

config PHY_QCOM_IPQ806X_USB
	tristate "Qualcomm IPQ806x DWC3 USB PHY driver"
	depends on HAS_IOMEM
	depends on OF && (ARCH_QCOM || COMPILE_TEST)
	select GENERIC_PHY
	help
	  This option enables support for the Synopsis PHYs present inside the
	  Qualcomm USB3.0 DWC3 controller on ipq806x SoC. This driver supports
	  both HS and SS PHY controllers.

config PHY_QCOM_SGMII_ETH
	tristate "Qualcomm DWMAC SGMII SerDes/PHY driver"
	depends on OF && (ARCH_QCOM || COMPILE_TEST)
	depends on HAS_IOMEM
	select GENERIC_PHY
	help
	  Enable this to support the internal SerDes/SGMII PHY on various
	  Qualcomm chipsets.
