#
# Broadcom pinctrl drivers
#

config PINCTRL_BCM281XX
	bool "Broadcom BCM281xx pinctrl driver"
	depends on OF && (ARCH_BCM_MOBILE || COMPILE_TEST)
	select PINMUX
	select PINCONF
	select GENERIC_PINCONF
	select REGMAP_MMIO
	default ARCH_BCM_MOBILE
	help
	  Say Y here to support Broadcom BCM281xx pinctrl driver, which is used
	  for the BCM281xx SoC family, including BCM11130, BCM11140, BCM11351,
	  BCM28145, and BCM28155 SoCs.  This driver requires the pinctrl
	  framework.  GPIO is provided by a separate GPIO driver.

config PINCTRL_BCM2835
	bool
	select PINMUX
	select PINCONF

config PINCTRL_IPROC_GPIO
	bool "Broadcom iProc GPIO (with PINCONF) driver"
	depends on OF_GPIO && (ARCH_BCM_IPROC || COMPILE_TEST)
	select GPIOLIB_IRQCHIP
	select PINCONF
	select GENERIC_PINCONF
	default ARCH_BCM_IPROC
	help
	  Say yes here to enable the Broadcom iProc GPIO driver.

	  The Broadcom iProc based SoCs- Cygnus, NS2, NSP and Stingray, use
	  same GPIO Controller IP hence this driver could be used for all.

	  The Broadcom Cygnus SoC has 3 GPIO controllers including the ASIU
	  GPIO controller (ASIU), the chipCommonG GPIO controller (CCM), and
	  the always-ON GPIO controller (CRMU/AON). All 3 GPIO controllers are
	  supported by this driver.

	  The Broadcom NSP has two GPIO controllers including the ChipcommonA
	  GPIO, the ChipcommonB GPIO. Later controller is supported by this
	  driver.

	  The Broadcom NS2 has two GPIO controller including the CRMU GPIO,
	  the ChipcommonG GPIO. Both controllers are supported by this driver.

	  The Broadcom Stingray GPIO controllers are supported by this driver.

	  All above SoCs GPIO controllers support basic PINCONF functions such
	  as bias pull up, pull down, and drive strength configurations, when
	  these pins are muxed to GPIO.

	  It provides the framework where pins from the individual GPIO can be
	  individually muxed to GPIO function, through interaction with the
	  SoCs IOMUX controller. This features could be used only on SoCs which
	  support individual pin muxing.

config PINCTRL_CYGNUS_MUX
	bool "Broadcom Cygnus IOMUX driver"
	depends on (ARCH_BCM_CYGNUS || COMPILE_TEST)
	select PINMUX
	select GENERIC_PINCONF
	default ARCH_BCM_CYGNUS
	help
	  Say yes here to enable the Broadcom Cygnus IOMUX driver.

	  The Broadcom Cygnus IOMUX driver supports group based IOMUX
	  configuration, with the exception that certain individual pins
	  can be overrided to GPIO function

config PINCTRL_NSP_GPIO
	bool "Broadcom NSP GPIO (with PINCONF) driver"
	depends on OF_GPIO && (ARCH_BCM_NSP || COMPILE_TEST)
	select GPIOLIB_IRQCHIP
	select PINCONF
	select GENERIC_PINCONF
	default ARCH_BCM_NSP
	help
	  Say yes here to enable the Broadcom NSP GPIO driver.

	  The Broadcom Northstar Plus SoC ChipcommonA GPIO controller is
	  supported by this driver.

	  The ChipcommonA GPIO controller support basic PINCONF functions such
	  as bias pull up, pull down, and drive strength configurations, when
	  these pins are muxed to GPIO.

config PINCTRL_NS2_MUX
	bool "Broadcom Northstar2 pinmux driver"
	depends on OF
	depends on ARCH_BCM_IPROC || COMPILE_TEST
	select PINMUX
	select GENERIC_PINCONF
	default ARM64 && ARCH_BCM_IPROC
	help
	  Say yes here to enable the Broadcom NS2 MUX driver.

	  The Broadcom Northstar2 IOMUX driver supports group based IOMUX
	  configuration.
