# SPDX-License-Identifier: GPL-2.0-only
#
# PCCARD (PCMCIA/CardBus) bus subsystem configuration
#

menuconfig PCCARD
	tristate "PCCard (PCMCIA/CardBus) support"
	help
	  Say Y here if you want to attach PCMCIA- or PC-cards to your Linux
	  computer.  These are credit-card size devices such as network cards,
	  modems or hard drives often used with laptops computers.  There are
	  actually two varieties of these cards: 16 bit PCMCIA and 32 bit
	  CardBus cards.

	  To compile this driver as modules, choose M here: the
	  module will be called pcmcia_core.

if PCCARD

config PCMCIA
	tristate "16-bit PCMCIA support"
	depends on HAS_IOMEM
	select CRC32
	default y
	help
	   This option enables support for 16-bit PCMCIA cards. Most older
	   PC-cards are such 16-bit PCMCIA cards, so unless you know you're
	   only using 32-bit CardBus cards, say Y or M here.

	   To use 16-bit PCMCIA cards, you will need supporting software in
	   most cases. (see the file <file:Documentation/Changes> for
	   location and details).

	   To compile this driver as modules, choose M here: the
	   module will be called pcmcia.

	   If unsure, say Y.

config PCMCIA_LOAD_CIS
	bool "Load CIS updates from userspace"
	depends on PCMCIA
	select FW_LOADER
	default y
	help
	  Some PCMCIA cards require an updated Card Information Structure (CIS)
	  to be loaded from userspace to work correctly. If you say Y here,
	  and your userspace is arranged correctly, this will be loaded
	  automatically using the in-kernel firmware loader and the hotplug
	  subsystem, instead of relying on cardmgr from pcmcia-cs to do so.

	  If unsure, say Y.

config CARDBUS
	bool "32-bit CardBus support"
	depends on PCI
	default y
	help
	  CardBus is a bus mastering architecture for PC-cards, which allows
	  for 32 bit PC-cards (the original PCMCIA standard specifies only
	  a 16 bit wide bus). Many newer PC-cards are actually CardBus cards.

	  To use 32 bit PC-cards, you also need a CardBus compatible host
	  bridge. Virtually all modern PCMCIA bridges do this, and most of
	  them are "yenta-compatible", so say Y or M there, too.

	  If unsure, say Y.

config PCMCIA_MAX1600
	tristate

comment "PC-card bridges"

config YENTA
	tristate "CardBus yenta-compatible bridge support"
	depends on PCI
	select CARDBUS if !EXPERT
	select PCCARD_NONSTATIC if PCMCIA != n
	help
	  This option enables support for CardBus host bridges.  Virtually
	  all modern PCMCIA bridges are CardBus compatible.  A "bridge" is
	  the hardware inside your computer that PCMCIA cards are plugged
	  into.

	  To compile this driver as modules, choose M here: the
	  module will be called yenta_socket.

	  If unsure, say Y.

config YENTA_O2
	default y
	bool "Special initialization for O2Micro bridges" if EXPERT
	depends on YENTA

config YENTA_RICOH
	default y
	bool "Special initialization for Ricoh bridges" if EXPERT
	depends on YENTA

config YENTA_TI
	default y
	bool "Special initialization for TI and EnE bridges" if EXPERT
	depends on YENTA

config YENTA_ENE_TUNE
	default y
	bool "Auto-tune EnE bridges for CB cards" if EXPERT
	depends on YENTA_TI && CARDBUS

config YENTA_TOSHIBA
	default y
	bool "Special initialization for Toshiba ToPIC bridges" if EXPERT
	depends on YENTA

config PD6729
	tristate "Cirrus PD6729 compatible bridge support"
	depends on PCMCIA && PCI && HAS_IOPORT
	select PCCARD_NONSTATIC
	help
	  This provides support for the Cirrus PD6729 PCI-to-PCMCIA bridge
	  device, found in some older laptops and PCMCIA card readers.

config I82092
	tristate "i82092 compatible bridge support"
	depends on PCMCIA && PCI && HAS_IOPORT
	select PCCARD_NONSTATIC
	help
	  This provides support for the Intel I82092AA PCI-to-PCMCIA bridge device,
	  found in some older laptops and more commonly in evaluation boards for the
	  chip.

config I82365
	tristate "i82365 compatible bridge support"
	depends on PCMCIA && ISA
	select PCCARD_NONSTATIC
	help
	  Say Y here to include support for ISA-bus PCMCIA host bridges that
	  are register compatible with the Intel i82365.  These are found on
	  older laptops and ISA-bus card readers for desktop systems.  A
	  "bridge" is the hardware inside your computer that PCMCIA cards are
	  plugged into. If unsure, say N.

config TCIC
	tristate "Databook TCIC host bridge support"
	depends on PCMCIA && ISA
	select PCCARD_NONSTATIC
	help
	  Say Y here to include support for the Databook TCIC family of PCMCIA
	  host bridges. These are only found on a handful of old systems.
	  "Bridge" is the name used for the hardware inside your computer that
	  PCMCIA cards are plugged into. If unsure, say N.

config PCMCIA_ALCHEMY_DEVBOARD
	tristate "Alchemy Db/Pb1xxx PCMCIA socket services"
	depends on MIPS_DB1XXX && PCMCIA
	help
	  Enable this driver of you want PCMCIA support on your Alchemy
	  Db1000, Db/Pb1100, Db/Pb1500, Db/Pb1550, Db/Pb1200, DB1300
	  board.  NOT suitable for the PB1000!

	  This driver is also available as a module called db1xxx_ss.ko

config PCMCIA_XXS1500
	tristate "MyCable XXS1500 PCMCIA socket support"
	depends on PCMCIA && MIPS_XXS1500
	help
	  Support for the PCMCIA/CF socket interface on MyCable XXS1500
	  systems.

	  This driver is also available as a module called xxs1500_ss.ko

config PCMCIA_BCM63XX
	tristate "bcm63xx pcmcia support"
	depends on BCM63XX && PCMCIA

config PCMCIA_SOC_COMMON
	tristate

config PCMCIA_SA11XX_BASE
	tristate

config PCMCIA_SA1100
	tristate "SA1100 support"
	depends on ARM && ARCH_SA1100 && PCMCIA
	select PCMCIA_SOC_COMMON
	select PCMCIA_SA11XX_BASE
	help
	  Say Y here to include support for SA11x0-based PCMCIA or CF
	  sockets, found on HP iPAQs, Yopy, and other StrongARM(R)/
	  Xscale(R) embedded machines.

	  This driver is also available as a module called sa1100_cs.

config PCMCIA_SA1111
	tristate "SA1111 support"
	depends on ARM && SA1111 && PCMCIA
	select PCMCIA_SOC_COMMON
	select PCMCIA_SA11XX_BASE
	select PCMCIA_MAX1600 if ASSABET_NEPONSET
	help
	  Say Y  here to include support for SA1111-based PCMCIA or CF
	  sockets, found on the Jornada 720, Graphicsmaster and other
	  StrongARM(R)/Xscale(R) embedded machines.

	  This driver is also available as a module called sa1111_cs.

config PCMCIA_PXA2XX
	tristate "PXA2xx support"
	depends on ARM && ARCH_PXA && PCMCIA && PXA_SHARPSL
	select PCMCIA_SOC_COMMON
	help
	  Say Y here to include support for the PXA2xx PCMCIA controller

config PCMCIA_DEBUG
	bool "Enable debugging"
	depends on (PCMCIA_SA1111 || PCMCIA_SA1100 || PCMCIA_PXA2XX)
	help
	  Say Y here to enable debugging for the SoC PCMCIA layer.
	  You will need to choose the debugging level either via the
	  kernel command line, or module options depending whether
	  you build the drivers as modules.

	  The kernel command line options are:
	    sa11xx_core.pc_debug=N
	    pxa2xx_core.pc_debug=N

	  The module option is called pc_debug=N

	  In all the above examples, N is the debugging verbosity
	  level.

config PCMCIA_PROBE
	bool
	default y if ISA && !ARCH_SA1100 && !PARISC

config OMAP_CF
	tristate "OMAP CompactFlash Controller"
	depends on PCMCIA
	depends on ARCH_OMAP16XX || (ARM && COMPILE_TEST)
	help
	  Say Y here to support the CompactFlash controller on OMAP.
	  Note that this doesn't support "True IDE" mode.

config ELECTRA_CF
	tristate "Electra CompactFlash Controller"
	depends on PCMCIA && PPC_PASEMI
	help
	  Say Y here to support the CompactFlash controller on the
	  PA Semi Electra eval board.

config PCCARD_NONSTATIC
	bool

config PCCARD_IODYN
	bool

endif	# PCCARD
