# 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_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:sound/oss/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:sound/oss/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
