# SPDX-License-Identifier: GPL-2.0-only
#
# Phy drivers for Allwinner platforms
#
config PHY_SUN4I_USB
	tristate "Allwinner sunxi SoC USB PHY driver"
	depends on ARCH_SUNXI || COMPILE_TEST
	depends on HAS_IOMEM
	depends on RESET_CONTROLLER
	depends on EXTCON
	depends on POWER_SUPPLY
	depends on USB_SUPPORT
	select GENERIC_PHY
	select USB_COMMON
	help
	  Enable this to support the transceiver that is part of Allwinner
	  sunxi SoCs.

	  This driver controls the entire USB PHY block, both the USB OTG
	  parts, as well as the 2 regular USB 2 host PHYs.

config PHY_SUN6I_MIPI_DPHY
	tristate "Allwinner A31 MIPI D-PHY Support"
	depends on ARCH_SUNXI || COMPILE_TEST
	depends on HAS_IOMEM && COMMON_CLK
	depends on RESET_CONTROLLER
	select GENERIC_PHY
	select GENERIC_PHY_MIPI_DPHY
	select REGMAP_MMIO
	help
	  Choose this option if you have an Allwinner SoC with
	  MIPI-DSI support. If M is selected, the module will be
	  called sun6i_mipi_dphy.

config PHY_SUN9I_USB
	tristate "Allwinner sun9i SoC USB PHY driver"
	depends on ARCH_SUNXI || COMPILE_TEST
	depends on HAS_IOMEM
	depends on RESET_CONTROLLER
	depends on USB_SUPPORT
	select USB_COMMON
	select GENERIC_PHY
	help
	  Enable this to support the transceiver that is part of Allwinner
	  sun9i SoCs.

	  This driver controls each individual USB 2 host PHY.

config PHY_SUN50I_USB3
	tristate "Allwinner H6 SoC USB3 PHY driver"
	depends on ARCH_SUNXI || COMPILE_TEST
	depends on HAS_IOMEM && OF
	depends on RESET_CONTROLLER
	select GENERIC_PHY
	help
	  Enable this to support the USB3.0-capable transceiver that is
	  part of Allwinner H6 SoC.

	  This driver controls each individual USB 2+3 host PHY combo.
