# drivers/sound/Config.in
#
# 18 Apr 1998, Michael Elizabeth Chastain, <mailto:mec@shout.net>
# More hacking for modularisation.
#
# Prompt user for primary drivers.

config SOUND_BCM_CS4297A
	tristate "Crystal Sound CS4297a (for Swarm)"
	depends on SOUND_PRIME && SIBYTE_SWARM
	help
	  The BCM91250A has a Crystal CS4297a on synchronous serial
	  port B (in addition to the DB-9 serial port).  Say Y or M
	  here to enable the sound chip instead of the UART.  Also
	  note that CONFIG_KGDB should not be enabled at the same
	  time, since it also attempts to use this UART port.

config SOUND_VWSND
	tristate "SGI Visual Workstation Sound"
	depends on SOUND_PRIME && X86_VISWS
	help
	  Say Y or M if you have an SGI Visual Workstation and you want to be
	  able to use its on-board audio.  Read
	  <file:Documentation/sound/oss/vwsnd> for more info on this driver's
	  capabilities.

config SOUND_HAL2
	tristate "SGI HAL2 sound (EXPERIMENTAL)"
	depends on SOUND_PRIME && SGI_IP22 && EXPERIMENTAL
	help
	  Say Y or M if you have an SGI Indy or Indigo2 system and want to be able to
	  use its on-board A2 audio system.

config SOUND_VRC5477
	tristate "NEC Vrc5477 AC97 sound"
	depends on SOUND_PRIME && DDB5477
	help
	  Say Y here to enable sound support for the NEC Vrc5477 chip, an
	  integrated, multi-function controller chip for MIPS CPUs.  Works
	  with the AC97 codec.

config SOUND_AU1550_AC97
	tristate "Au1550/Au1200 AC97 Sound"
	select SND_AC97_CODEC
	depends on SOUND_PRIME && (SOC_AU1550 || SOC_AU1200)

config SOUND_TRIDENT
	tristate "Trident 4DWave DX/NX, SiS 7018 or ALi 5451 PCI Audio Core"
	depends on SOUND_PRIME && PCI
	---help---
	  Say Y or M if you have a PCI sound card utilizing the Trident
	  4DWave-DX/NX chipset or your mother board chipset has SiS 7018
	  or ALi 5451 built-in. The SiS 7018 PCI Audio Core is embedded
	  in SiS960 Super South Bridge and SiS540/630 Single Chipset.
	  The ALi 5451 PCI Audio Core is embedded in ALi M1535, M1535D,
	  M1535+ or M1535D+ South Bridge.

	  Use lspci -n to find out if your sound card or chipset uses
	  Trident 4DWave or SiS 7018. PCI ID 1023:2000 or 1023:2001 stands
	  for Trident 4Dwave. PCI ID 1039:7018 stands for SiS7018. PCI ID
	  10B9:5451 stands for ALi5451.

	  This driver supports S/PDIF in/out (record/playback) for ALi 5451
	  embedded in ALi M1535+ and M1535D+. Note that they aren't all
	  enabled by default; you can enable them by saying Y to "/proc file
	  system support" and "Sysctl support", and after the /proc file
	  system has been mounted, executing the command

		command			what is enabled

	  echo 0>/proc/ALi5451	pcm out is also set to S/PDIF out. (Default).

	  echo 1>/proc/ALi5451	use S/PDIF out to output pcm data.

	  echo 2>/proc/ALi5451	use S/PDIF out to output non-pcm data.
	  (AC3...).

	  echo 3>/proc/ALi5451	record from Ac97 in(MIC, Line in...).
	  (Default).

	  echo 4>/proc/ALi5451	no matter Ac97 settings, record from S/PDIF
	  in.


	  This driver differs slightly from OSS/Free, so PLEASE READ the
	  comments at the top of <file:drivers/sound/trident.c>.

config SOUND_MSNDCLAS
	tristate "Support for Turtle Beach MultiSound Classic, Tahiti, Monterey"
	depends on SOUND_PRIME && (m || !STANDALONE)
	help
	  Say M here if you have a Turtle Beach MultiSound Classic, Tahiti or
	  Monterey (not for the Pinnacle or Fiji).

	  See <file:Documentation/sound/oss/MultiSound> for important information
	  about this driver.  Note that it has been discontinued, but the
	  Voyetra Turtle Beach knowledge base entry for it is still available
	  at <http://www.turtlebeach.com/site/kb_ftp/790.asp>.

comment "Compiled-in MSND Classic support requires firmware during compilation."
	depends on SOUND_PRIME && SOUND_MSNDCLAS=y

config MSNDCLAS_HAVE_BOOT
	bool
	depends on SOUND_MSNDCLAS=y && !STANDALONE
	default y

config MSNDCLAS_INIT_FILE
	string "Full pathname of MSNDINIT.BIN firmware file"
	depends on SOUND_MSNDCLAS
	default "/etc/sound/msndinit.bin"
	help
	  The MultiSound cards have two firmware files which are required for
	  operation, and are not currently included. These files can be
	  obtained from Turtle Beach. See
	  <file:Documentation/sound/oss/MultiSound> for information on how to
	  obtain this.

config MSNDCLAS_PERM_FILE
	string "Full pathname of MSNDPERM.BIN firmware file"
	depends on SOUND_MSNDCLAS
	default "/etc/sound/msndperm.bin"
	help
	  The MultiSound cards have two firmware files which are required for
	  operation, and are not currently included. These files can be
	  obtained from Turtle Beach. See
	  <file:Documentation/sound/oss/MultiSound> for information on how to
	  obtain this.

config MSNDCLAS_IRQ
	int "MSND Classic IRQ 5, 7, 9, 10, 11, 12"
	depends on SOUND_MSNDCLAS=y
	default "5"
	help
	  Interrupt Request line for the MultiSound Classic and related cards.

config MSNDCLAS_MEM
	hex "MSND Classic memory B0000, C8000, D0000, D8000, E0000, E8000"
	depends on SOUND_MSNDCLAS=y
	default "D0000"
	help
	  Memory-mapped I/O base address for the MultiSound Classic and
	  related cards.

config MSNDCLAS_IO
	hex "MSND Classic I/O 210, 220, 230, 240, 250, 260, 290, 3E0"
	depends on SOUND_MSNDCLAS=y
	default "290"
	help
	  I/O port address for the MultiSound Classic and related cards.

config SOUND_MSNDPIN
	tristate "Support for Turtle Beach MultiSound Pinnacle, Fiji"
	depends on SOUND_PRIME && (m || !STANDALONE)
	help
	  Say M here if you have a Turtle Beach MultiSound Pinnacle or Fiji.
	  See <file:Documentation/sound/oss/MultiSound> for important information
	  about this driver. Note that it has been discontinued, but the
	  Voyetra Turtle Beach knowledge base entry for it is still available
	  at <http://www.turtlebeach.com/site/kb_ftp/600.asp>.

comment "Compiled-in MSND Pinnacle support requires firmware during compilation."
	depends on SOUND_PRIME && SOUND_MSNDPIN=y

config MSNDPIN_HAVE_BOOT
	bool
	depends on SOUND_MSNDPIN=y
	default y

config MSNDPIN_INIT_FILE
	string "Full pathname of PNDSPINI.BIN firmware file"
	depends on SOUND_MSNDPIN
	default "/etc/sound/pndspini.bin"
	help
	  The MultiSound cards have two firmware files which are required
	  for operation, and are not currently included. These files can be
	  obtained from Turtle Beach. See
	  <file:Documentation/sound/oss/MultiSound> for information on how to
	  obtain this.

config MSNDPIN_PERM_FILE
	string "Full pathname of PNDSPERM.BIN firmware file"
	depends on SOUND_MSNDPIN
	default "/etc/sound/pndsperm.bin"
	help
	  The MultiSound cards have two firmware files which are required for
	  operation, and are not currently included. These files can be
	  obtained from Turtle Beach. See
	  <file:Documentation/sound/oss/MultiSound> for information on how to
	  obtain this.

config MSNDPIN_IRQ
	int "MSND Pinnacle IRQ 5, 7, 9, 10, 11, 12"
	depends on SOUND_MSNDPIN=y
	default "5"
	help
	  Interrupt request line for the primary synthesizer on MultiSound
	  Pinnacle and Fiji sound cards.

config MSNDPIN_MEM
	hex "MSND Pinnacle memory B0000, C8000, D0000, D8000, E0000, E8000"
	depends on SOUND_MSNDPIN=y
	default "D0000"
	help
	  Memory-mapped I/O base address for the primary synthesizer on
	  MultiSound Pinnacle and Fiji sound cards.

config MSNDPIN_IO
	hex "MSND Pinnacle I/O 210, 220, 230, 240, 250, 260, 290, 3E0"
	depends on SOUND_MSNDPIN=y
	default "290"
	help
	  Memory-mapped I/O base address for the primary synthesizer on
	  MultiSound Pinnacle and Fiji sound cards.

config MSNDPIN_DIGITAL
	bool "MSND Pinnacle has S/PDIF I/O"
	depends on SOUND_MSNDPIN=y
	help
	  If you have the S/PDIF daughter board for the Pinnacle or Fiji,
	  answer Y here; otherwise, say N. If you have this, you will be able
	  to play and record from the S/PDIF port (digital signal). See
	  <file:Documentation/sound/oss/MultiSound> for information on how to make
	  use of this capability.

config MSNDPIN_NONPNP
	bool "MSND Pinnacle non-PnP Mode"
	depends on SOUND_MSNDPIN=y
	help
	  The Pinnacle and Fiji card resources can be configured either with
	  PnP, or through a configuration port. Say Y here if your card is NOT
	  in PnP mode. For the Pinnacle, configuration in non-PnP mode allows
	  use of the IDE and joystick peripherals on the card as well; these
	  do not show up when the card is in PnP mode. Specifying zero for any
	  resource of a device will disable the device. If you are running the
	  card in PnP mode, you must say N here and use isapnptools to
	  configure the card's resources.

comment "MSND Pinnacle DSP section will be configured to above parameters."
	depends on SOUND_PRIME && SOUND_MSNDPIN=y && MSNDPIN_NONPNP

config MSNDPIN_CFG
	hex "MSND Pinnacle config port 250,260,270"
	depends on MSNDPIN_NONPNP
	default "250"
	help
	  This is the port which the Pinnacle and Fiji uses to configure the
	  card's resources when not in PnP mode. If your card is in PnP mode,
	  then be sure to say N to the previous option, "MSND Pinnacle Non-PnP
	  Mode".

comment "Pinnacle-specific Device Configuration (0 disables)"
	depends on SOUND_PRIME && SOUND_MSNDPIN=y && MSNDPIN_NONPNP

config MSNDPIN_MPU_IO
	hex "MSND Pinnacle MPU I/O (e.g. 330)"
	depends on MSNDPIN_NONPNP
	default "0"
	help
	  Memory-mapped I/O base address for the Kurzweil daughterboard
	  synthesizer on MultiSound Pinnacle and Fiji sound cards.

config MSNDPIN_MPU_IRQ
	int "MSND Pinnacle MPU IRQ (e.g. 9)"
	depends on MSNDPIN_NONPNP
	default "0"
	help
	  Interrupt request number for the Kurzweil daughterboard
	  synthesizer on MultiSound Pinnacle and Fiji sound cards.

config MSNDPIN_IDE_IO0
	hex "MSND Pinnacle IDE I/O 0 (e.g. 170)"
	depends on MSNDPIN_NONPNP
	default "0"
	help
	  CD-ROM drive 0 memory-mapped I/O base address for the MultiSound
	  Pinnacle and Fiji sound cards.

config MSNDPIN_IDE_IO1
	hex "MSND Pinnacle IDE I/O 1 (e.g. 376)"
	depends on MSNDPIN_NONPNP
	default "0"
	help
	  CD-ROM drive 1 memory-mapped I/O base address for the MultiSound
	  Pinnacle and Fiji sound cards.

config MSNDPIN_IDE_IRQ
	int "MSND Pinnacle IDE IRQ (e.g. 15)"
	depends on MSNDPIN_NONPNP
	default "0"
	help
	  Interrupt request number for the IDE CD-ROM interface on the
	  MultiSound Pinnacle and Fiji sound cards.

config MSNDPIN_JOYSTICK_IO
	hex "MSND Pinnacle joystick I/O (e.g. 200)"
	depends on MSNDPIN_NONPNP
	default "0"
	help
	  Memory-mapped I/O base address for the joystick port on MultiSound
	  Pinnacle and Fiji sound cards.

config MSND_FIFOSIZE
	int "MSND buffer size (kB)"
	depends on SOUND_PRIME && (SOUND_MSNDPIN=y || SOUND_MSNDCLAS=y)
	default "128"
	help
	  Configures the size of each audio buffer, in kilobytes, for
	  recording and playing in the MultiSound drivers (both the Classic
	  and Pinnacle). Larger values reduce the chance of data overruns at
	  the expense of overall latency. If unsure, use the default.

config SOUND_OSS
	tristate "OSS sound modules"
	depends on SOUND_PRIME && ISA_DMA_API && VIRT_TO_BUS
	help
	  OSS is the Open Sound System suite of sound card drivers.  They make
	  sound programming easier since they provide a common API.  Say Y or
	  M here (the module will be called sound) if you haven't found a
	  driver for your sound card above, then pick your driver from the
	  list below.

config SOUND_TRACEINIT
	bool "Verbose initialisation"
	depends on SOUND_OSS
	help
	  Verbose soundcard initialization -- affects the format of autoprobe
	  and initialization messages at boot time.

config SOUND_DMAP
	bool "Persistent DMA buffers"
	depends on SOUND_OSS
	---help---
	  Linux can often have problems allocating DMA buffers for ISA sound
	  cards on machines with more than 16MB of RAM. This is because ISA
	  DMA buffers must exist below the 16MB boundary and it is quite
	  possible that a large enough free block in this region cannot be
	  found after the machine has been running for a while. If you say Y
	  here the DMA buffers (64Kb) will be allocated at boot time and kept
	  until the shutdown. This option is only useful if you said Y to
	  "OSS sound modules", above. If you said M to "OSS sound modules"
	  then you can get the persistent DMA buffer functionality by passing
	  the command-line argument "dmabuf=1" to the sound module.

	  Say Y unless you have 16MB or more RAM or a PCI sound card.

config SOUND_SSCAPE
	tristate "Ensoniq SoundScape support"
	depends on SOUND_OSS
	depends on VIRT_TO_BUS
	help
	  Answer Y if you have a sound card based on the Ensoniq SoundScape
	  chipset. Such cards are being manufactured at least by Ensoniq, Spea
	  and Reveal (Reveal makes also other cards).

	  If you compile the driver into the kernel, you have to add
	  "sscape=<io>,<irq>,<dma>,<mpuio>,<mpuirq>" to the kernel command
	  line.


config SOUND_VMIDI
	tristate "Loopback MIDI device support"
	depends on SOUND_OSS
	help
	  Support for MIDI loopback on port 1 or 2.

config SOUND_TRIX
	tristate "MediaTrix AudioTrix Pro support"
	depends on SOUND_OSS
	help
	  Answer Y if you have the AudioTriX Pro sound card manufactured
	  by MediaTrix.

config TRIX_HAVE_BOOT
	bool "Have TRXPRO.HEX firmware file"
	depends on SOUND_TRIX=y && !STANDALONE
	help
	  The MediaTrix AudioTrix Pro has an on-board microcontroller which
	  needs to be initialized by downloading the code from the file
	  TRXPRO.HEX in the DOS driver directory. If you don't have the
	  TRXPRO.HEX file handy you may skip this step. However, the SB and
	  MPU-401 modes of AudioTrix Pro will not work without this file!

config TRIX_BOOT_FILE
	string "Full pathname of TRXPRO.HEX firmware file"
	depends on TRIX_HAVE_BOOT
	default "/etc/sound/trxpro.hex"
	help
	  Enter the full pathname of your TRXPRO.HEX file, starting from /.

config SOUND_MSS
	tristate "Microsoft Sound System support"
	depends on SOUND_OSS
	---help---
	  Again think carefully before answering Y to this question.  It's
	  safe to answer Y if you have the original Windows Sound System card
	  made by Microsoft or Aztech SG 16 Pro (or NX16 Pro).  Also you may
	  say Y in case your card is NOT among these:

	  ATI Stereo F/X, AdLib, Audio Excell DSP16, Cardinal DSP16,
	  Ensoniq SoundScape (and compatibles made by Reveal and Spea),
	  Gravis Ultrasound, Gravis Ultrasound ACE, Gravis Ultrasound Max,
	  Gravis Ultrasound with 16 bit option, Logitech Sound Man 16,
	  Logitech SoundMan Games, Logitech SoundMan Wave, MAD16 Pro (OPTi
	  82C929), Media Vision Jazz16, MediaTriX AudioTriX Pro, Microsoft
	  Windows Sound System (MSS/WSS), Mozart (OAK OTI-601), Orchid
	  SW32, Personal Sound System (PSS), Pro Audio Spectrum 16, Pro
	  Audio Studio 16, Pro Sonic 16, Roland MPU-401 MIDI interface,
	  Sound Blaster 1.0, Sound Blaster 16, Sound Blaster 16ASP, Sound
	  Blaster 2.0, Sound Blaster AWE32, Sound Blaster Pro, TI TM4000M
	  notebook, ThunderBoard, Turtle Beach Tropez, Yamaha FM
	  synthesizers (OPL2, OPL3 and OPL4), 6850 UART MIDI Interface.

	  For cards having native support in VoxWare, consult the card
	  specific instructions in <file:Documentation/sound/oss/README.OSS>.
	  Some drivers have their own MSS support and saying Y to this option
	  will cause a conflict.

	  If you compile the driver into the kernel, you have to add
	  "ad1848=<io>,<irq>,<dma>,<dma2>[,<type>]" to the kernel command
	  line.

config SOUND_MPU401
	tristate "MPU-401 support (NOT for SB16)"
	depends on SOUND_OSS
	---help---
	  Be careful with this question.  The MPU401 interface is supported by
	  all sound cards.  However, some natively supported cards have their
	  own driver for MPU401.  Enabling this MPU401 option with these cards
	  will cause a conflict.  Also, enabling MPU401 on a system that
	  doesn't really have a MPU401 could cause some trouble.  If your card
	  was in the list of supported cards, look at the card specific
	  instructions in the <file:Documentation/sound/oss/README.OSS> file.  It
	  is safe to answer Y if you have a true MPU401 MIDI interface card.

	  If you compile the driver into the kernel, you have to add
	  "mpu401=<io>,<irq>" to the kernel command line.

config SOUND_PAS
	tristate "ProAudioSpectrum 16 support"
	depends on SOUND_OSS
	---help---
	  Answer Y only if you have a Pro Audio Spectrum 16, ProAudio Studio
	  16 or Logitech SoundMan 16 sound card. Answer N if you have some
	  other card made by Media Vision or Logitech since those are not
	  PAS16 compatible. Please read <file:Documentation/sound/oss/PAS16>.
	  It is not necessary to add Sound Blaster support separately; it
	  is included in PAS support.

	  If you compile the driver into the kernel, you have to add
	  "pas2=<io>,<irq>,<dma>,<dma2>,<sbio>,<sbirq>,<sbdma>,<sbdma2>
	  to the kernel command line.

config PAS_JOYSTICK
	bool "Enable PAS16 joystick port"
	depends on SOUND_PAS=y
	help
	  Say Y here to enable the Pro Audio Spectrum 16's auxiliary joystick
	  port.

config SOUND_PSS
	tristate "PSS (AD1848, ADSP-2115, ESC614) support"
	depends on SOUND_OSS
	help
	  Answer Y or M if you have an Orchid SW32, Cardinal DSP16, Beethoven
	  ADSP-16 or some other card based on the PSS chipset (AD1848 codec +
	  ADSP-2115 DSP chip + Echo ESC614 ASIC CHIP). For more information on
	  how to compile it into the kernel or as a module see the file
	  <file:Documentation/sound/oss/PSS>.

	  If you compile the driver into the kernel, you have to add
	  "pss=<io>,<mssio>,<mssirq>,<mssdma>,<mpuio>,<mpuirq>" to the kernel
	  command line.

config PSS_MIXER
	bool "Enable PSS mixer (Beethoven ADSP-16 and other compatible)"
	depends on SOUND_PSS
	help
	  Answer Y for Beethoven ADSP-16. You may try to say Y also for other
	  cards if they have master volume, bass, treble, and you can't
	  control it under Linux. If you answer N for Beethoven ADSP-16, you
	  can't control master volume, bass, treble and synth volume.

	  If you said M to "PSS support" above, you may enable or disable this
	  PSS mixer with the module parameter pss_mixer. For more information
	  see the file <file:Documentation/sound/oss/PSS>.

config PSS_HAVE_BOOT
	bool "Have DSPxxx.LD firmware file"
	depends on SOUND_PSS && !STANDALONE
	help
	  If you have the DSPxxx.LD file or SYNTH.LD file for you card, say Y
	  to include this file. Without this file the synth device (OPL) may
	  not work.

config PSS_BOOT_FILE
	string "Full pathname of DSPxxx.LD firmware file"
	depends on PSS_HAVE_BOOT
	default "/etc/sound/dsp001.ld"
	help
	  Enter the full pathname of your DSPxxx.LD file or SYNTH.LD file,
	  starting from /.

config SOUND_SB
	tristate "100% Sound Blaster compatibles (SB16/32/64, ESS, Jazz16) support"
	depends on SOUND_OSS
	---help---
	  Answer Y if you have an original Sound Blaster card made by Creative
	  Labs or a 100% hardware compatible clone (like the Thunderboard or
	  SM Games). For an unknown card you may answer Y if the card claims
	  to be Sound Blaster-compatible.

	  Please read the file <file:Documentation/sound/oss/Soundblaster>.

	  You should also say Y here for cards based on the Avance Logic
	  ALS-007 and ALS-1X0 chips (read <file:Documentation/sound/oss/ALS>) and
	  for cards based on ESS chips (read
	  <file:Documentation/sound/oss/ESS1868> and
	  <file:Documentation/sound/oss/ESS>). If you have an SB AWE 32 or SB AWE
	  64, say Y here and also to "AWE32 synth" below and read
	  <file:Documentation/sound/oss/INSTALL.awe>. If you have an IBM Mwave
	  card, say Y here and read <file:Documentation/sound/oss/mwave>.

	  If you compile the driver into the kernel and don't want to use
	  isapnp, you have to add "sb=<io>,<irq>,<dma>,<dma2>" to the kernel
	  command line.

	  You can say M here to compile this driver as a module; the module is
	  called sb.

config SOUND_YM3812
	tristate "Yamaha FM synthesizer (YM3812/OPL-3) support"
	depends on SOUND_OSS
	---help---
	  Answer Y if your card has a FM chip made by Yamaha (OPL2/OPL3/OPL4).
	  Answering Y is usually a safe and recommended choice, however some
	  cards may have software (TSR) FM emulation. Enabling FM support with
	  these cards may cause trouble (I don't currently know of any such
	  cards, however). Please read the file
	  <file:Documentation/sound/oss/OPL3> if your card has an OPL3 chip.

	  If you compile the driver into the kernel, you have to add
	  "opl3=<io>" to the kernel command line.

	  If unsure, say Y.

config SOUND_UART6850
	tristate "6850 UART support"
	depends on SOUND_OSS
	help
	  This option enables support for MIDI interfaces based on the 6850
	  UART chip. This interface is rarely found on sound cards. It's safe
	  to answer N to this question.

	  If you compile the driver into the kernel, you have to add
	  "uart6850=<io>,<irq>" to the kernel command line.

config SOUND_AEDSP16
	tristate "Gallant Audio Cards (SC-6000 and SC-6600 based)"
	depends on SOUND_OSS
	---help---
	  Answer Y if you have a Gallant's Audio Excel DSP 16 card. This
	  driver supports Audio Excel DSP 16 but not the III nor PnP versions
	  of this card.

	  The Gallant's Audio Excel DSP 16 card can emulate either an SBPro or
	  a Microsoft Sound System card, so you should have said Y to either
	  "100% Sound Blaster compatibles (SB16/32/64, ESS, Jazz16) support"
	  or "Microsoft Sound System support", above, and you need to answer
	  the "MSS emulation" and "SBPro emulation" questions below
	  accordingly. You should say Y to one and only one of these two
	  questions.

	  Read the <file:Documentation/sound/oss/README.OSS> file and the head of
	  <file:drivers/sound/aedsp16.c> as well as
	  <file:Documentation/sound/oss/AudioExcelDSP16> to get more information
	  about this driver and its configuration.

config SC6600
	bool "SC-6600 based audio cards (new Audio Excel DSP 16)"
	depends on SOUND_AEDSP16
	help
	  The SC6600 is the new version of DSP mounted on the Audio Excel DSP
	  16 cards. Find in the manual the FCC ID of your audio card and
	  answer Y if you have an SC6600 DSP.

config SC6600_JOY
	bool "Activate SC-6600 Joystick Interface"
	depends on SC6600
	help
	  Say Y here in order to use the joystick interface of the Audio Excel
	  DSP 16 card.

config SC6600_CDROM
	int "SC-6600 CDROM Interface (4=None, 3=IDE, 1=Panasonic, 0=?Sony?)"
	depends on SC6600
	default "4"
	help
	  This is used to activate the CD-ROM interface of the Audio Excel
	  DSP 16 card. Enter: 0 for Sony, 1 for Panasonic, 2 for IDE, 4 for no
	  CD-ROM present.

config SC6600_CDROMBASE
	hex "SC-6600 CDROM Interface I/O Address"
	depends on SC6600
	default "0"
	help
	  Base I/O port address for the CD-ROM interface of the Audio Excel
	  DSP 16 card.

choice
	prompt "Audio Excel DSP 16"
	optional
	depends on SOUND_AEDSP16

config AEDSP16_MSS
	bool "MSS emulation"
	depends on SOUND_MSS
	help
	  Answer Y if you want your audio card to emulate Microsoft Sound
	  System. You should then say Y to "Microsoft Sound System support"
	  and say N to "Audio Excel DSP 16 (SBPro emulation)".

config AEDSP16_SBPRO
	bool "SBPro emulation"
	depends on SOUND_SB
	help
	  Answer Y if you want your audio card to emulate Sound Blaster Pro.
	  You should then say Y to "100% Sound Blaster compatibles
	  (SB16/32/64, ESS, Jazz16) support" and N to "Audio Excel DSP 16 (MSS
	  emulation)".

	  If you compile the driver into the kernel, you have to add
	  "aedsp16=<io>,<irq>,<dma>,<mssio>,<mpuio>,<mouirq>" to the kernel
	  command line.

endchoice

config SOUND_VIDC
	tristate "VIDC 16-bit sound"
	depends on ARM && (ARCH_ACORN || ARCH_CLPS7500) && SOUND_OSS
	help
	  16-bit support for the VIDC onboard sound hardware found on Acorn
	  machines.

config SOUND_WAVEARTIST
	tristate "Netwinder WaveArtist"
	depends on ARM && SOUND_OSS && ARCH_NETWINDER
	help
	  Say Y here to include support for the Rockwell WaveArtist sound
	  system.  This driver is mainly for the NetWinder.

config SOUND_KAHLUA
	tristate "XpressAudio Sound Blaster emulation"
	depends on SOUND_SB

config SOUND_SH_DAC_AUDIO
	tristate "SuperH DAC audio support"
	depends on SOUND_PRIME && CPU_SH3

config SOUND_SH_DAC_AUDIO_CHANNEL
	int "DAC channel"
	default "1"
	depends on SOUND_SH_DAC_AUDIO
