#
# 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
	select GENERIC_PINCONF
	select GPIOLIB
	select GPIOLIB_IRQCHIP

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)
	depends on OF
	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 overridden 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.

config PINCTRL_NSP_MUX
	bool "Broadcom NSP IOMUX driver"
	depends on (ARCH_BCM_NSP || COMPILE_TEST)
	depends on OF
	select PINMUX
	select GENERIC_PINCONF
	default ARCH_BCM_NSP
	help
	  Say yes here to enable the Broadcom NSP SOC IOMUX driver.

	  The Broadcom Northstar Plus IOMUX driver supports pin based IOMUX
	  configuration, with certain individual pins can be overridden
	  to GPIO function.
