Merge branch 'linus' of master.kernel.org:/pub/scm/linux/kernel/git/perex/alsa
authorLinus Torvalds <torvalds@woody.linux-foundation.org>
Tue, 16 Oct 2007 17:13:38 +0000 (10:13 -0700)
committerLinus Torvalds <torvalds@woody.linux-foundation.org>
Tue, 16 Oct 2007 17:13:38 +0000 (10:13 -0700)
* 'linus' of master.kernel.org:/pub/scm/linux/kernel/git/perex/alsa: (264 commits)
  [ALSA] version 1.0.15
  [ALSA] Fix thinko in cs4231 mce down check
  [ALSA] sun-cs4231: improved waiting after MCE down
  [ALSA] sun-cs4231: use cs4231-regs.h
  [ALSA] This simplifies and fixes waiting loops of the mce_down()
  [ALSA] This patch adds support for a wavetable chip on
  [ALSA] This patch removes open_mutex from the ad1848-lib as
  [ALSA] fix bootup crash in snd_gus_interrupt()
  [ALSA] hda-codec - Fix SKU ID function for realtek codecs
  [ALSA] Support  ASUS P701 eeepc [0x1043 0x82a1] support
  [ALSA] hda-codec - Add array terminator for dmic in STAC codec
  [ALSA] hdsp - Fix zero division
  [ALSA] usb-audio - Fix double comment
  [ALSA] hda-codec - Fix STAC922x volume knob control
  [ALSA] Changed Jaroslav Kysela's e-mail from perex@suse.cz to perex@perex.cz
  [ALSA] hda-codec - Fix for Fujitsu Lifebook C1410
  [ALSA] mpu-401: remove MPU401_INFO_UART_ONLY flag
  [ALSA] mpu-401: do not require an ACK byte for the ENTER_UART command
  [ALSA] via82xx - Add DXS quirk for Shuttle AK31v2
  [ALSA] hda-codec - Fix input_mux numbers for vaio stac92xx
  ...

370 files changed:
CREDITS
Documentation/sound/alsa/ALSA-Configuration.txt
Documentation/sound/alsa/CMIPCI.txt
Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl
Documentation/sound/alsa/OSS-Emulation.txt
Documentation/sound/alsa/hda_codec.txt
Documentation/sound/alsa/powersave.txt [new file with mode: 0644]
MAINTAINERS
drivers/media/video/cx88/cx88-alsa.c
drivers/net/hp100.c
drivers/pnp/interface.c
drivers/pnp/isapnp/core.c
drivers/pnp/isapnp/proc.c
drivers/pnp/manager.c
drivers/pnp/resource.c
include/linux/i2c-id.h
include/linux/spi/at73c213.h [new file with mode: 0644]
include/sound/ac97_codec.h
include/sound/ad1848.h
include/sound/ainstr_gf1.h
include/sound/ainstr_iw.h
include/sound/ainstr_simple.h
include/sound/ak4114.h
include/sound/ak4117.h
include/sound/ak4531_codec.h
include/sound/ak4xxx-adda.h
include/sound/asequencer.h
include/sound/asound.h
include/sound/asound_fm.h
include/sound/asoundef.h
include/sound/control.h
include/sound/core.h
include/sound/cs4231-regs.h [new file with mode: 0644]
include/sound/cs4231.h
include/sound/cs46xx.h
include/sound/cs46xx_dsp_scb_types.h
include/sound/cs46xx_dsp_spos.h
include/sound/cs46xx_dsp_task_types.h
include/sound/cs8403.h
include/sound/cs8427.h
include/sound/driver.h
include/sound/emu10k1.h
include/sound/es1688.h
include/sound/gus.h
include/sound/hda_hwdep.h [new file with mode: 0644]
include/sound/hdspm.h
include/sound/hwdep.h
include/sound/info.h
include/sound/initval.h
include/sound/memalloc.h
include/sound/mixer_oss.h
include/sound/mpu401.h
include/sound/opl3.h
include/sound/pcm-indirect.h
include/sound/pcm.h
include/sound/pcm_oss.h
include/sound/rawmidi.h
include/sound/sb.h
include/sound/seq_instr.h
include/sound/seq_midi_event.h
include/sound/seq_virmidi.h
include/sound/soc.h
include/sound/tea575x-tuner.h
include/sound/timer.h
include/sound/tlv.h
include/sound/version.h
include/sound/ymfpci.h
sound/Kconfig
sound/Makefile
sound/aoa/codecs/snd-aoa-codec-onyx.c
sound/aoa/codecs/snd-aoa-codec-tas.c
sound/aoa/fabrics/snd-aoa-fabric-layout.c
sound/arm/sa11xx-uda1341.c
sound/core/Makefile
sound/core/control.c
sound/core/device.c
sound/core/hwdep.c
sound/core/info.c
sound/core/info_oss.c
sound/core/init.c
sound/core/isadma.c
sound/core/memalloc.c
sound/core/memory.c
sound/core/misc.c
sound/core/oss/Makefile
sound/core/oss/copy.c
sound/core/oss/io.c
sound/core/oss/linear.c
sound/core/oss/mixer_oss.c
sound/core/oss/mulaw.c
sound/core/oss/pcm_oss.c
sound/core/oss/pcm_plugin.c
sound/core/oss/pcm_plugin.h
sound/core/oss/plugin_ops.h [deleted file]
sound/core/oss/rate.c
sound/core/oss/route.c
sound/core/pcm.c
sound/core/pcm_lib.c
sound/core/pcm_memory.c
sound/core/pcm_misc.c
sound/core/pcm_native.c
sound/core/pcm_timer.c
sound/core/rawmidi.c
sound/core/seq/Makefile
sound/core/seq/instr/Makefile
sound/core/seq/instr/ainstr_gf1.c
sound/core/seq/instr/ainstr_iw.c
sound/core/seq/instr/ainstr_simple.c
sound/core/seq/oss/Makefile
sound/core/seq/oss/seq_oss_init.c
sound/core/seq/oss/seq_oss_writeq.c
sound/core/seq/seq.c
sound/core/seq/seq_clientmgr.c
sound/core/seq/seq_instr.c
sound/core/seq/seq_memory.c
sound/core/seq/seq_midi.c
sound/core/seq/seq_midi_event.c
sound/core/seq/seq_ports.c
sound/core/seq/seq_timer.c
sound/core/sound.c
sound/core/sound_oss.c
sound/core/timer.c
sound/drivers/Makefile
sound/drivers/dummy.c
sound/drivers/mpu401/Makefile
sound/drivers/mpu401/mpu401.c
sound/drivers/mpu401/mpu401_uart.c
sound/drivers/mts64.c
sound/drivers/opl3/Makefile
sound/drivers/opl3/opl3_lib.c
sound/drivers/opl4/Makefile
sound/drivers/serial-u16550.c
sound/drivers/vx/Makefile
sound/drivers/vx/vx_mixer.c
sound/i2c/Makefile
sound/i2c/cs8427.c
sound/i2c/i2c.c
sound/i2c/other/Makefile
sound/i2c/other/ak4114.c
sound/i2c/other/ak4117.c
sound/i2c/other/ak4xxx-adda.c
sound/i2c/other/pt2258.c
sound/i2c/other/tea575x-tuner.c
sound/i2c/tea6330t.c
sound/isa/Kconfig
sound/isa/Makefile
sound/isa/ad1816a/Makefile
sound/isa/ad1816a/ad1816a_lib.c
sound/isa/ad1848/Makefile
sound/isa/ad1848/ad1848.c
sound/isa/ad1848/ad1848_lib.c
sound/isa/cs423x/Makefile
sound/isa/cs423x/cs4231.c
sound/isa/cs423x/cs4231_lib.c
sound/isa/cs423x/cs4236.c
sound/isa/cs423x/cs4236_lib.c
sound/isa/es1688/Makefile
sound/isa/es1688/es1688.c
sound/isa/es1688/es1688_lib.c
sound/isa/es18xx.c
sound/isa/gus/Makefile
sound/isa/gus/gus_dma.c
sound/isa/gus/gus_dram.c
sound/isa/gus/gus_instr.c
sound/isa/gus/gus_io.c
sound/isa/gus/gus_irq.c
sound/isa/gus/gus_main.c
sound/isa/gus/gus_mem.c
sound/isa/gus/gus_mem_proc.c
sound/isa/gus/gus_mixer.c
sound/isa/gus/gus_pcm.c
sound/isa/gus/gus_reset.c
sound/isa/gus/gus_sample.c
sound/isa/gus/gus_simple.c
sound/isa/gus/gus_synth.c
sound/isa/gus/gus_tables.h
sound/isa/gus/gus_timer.c
sound/isa/gus/gus_uart.c
sound/isa/gus/gus_volume.c
sound/isa/gus/gusclassic.c
sound/isa/gus/gusextreme.c
sound/isa/gus/gusmax.c
sound/isa/gus/interwave.c
sound/isa/opl3sa2.c
sound/isa/opti9xx/Makefile
sound/isa/opti9xx/miro.c
sound/isa/opti9xx/opti92x-ad1848.c
sound/isa/sb/Makefile
sound/isa/sb/emu8000.c
sound/isa/sb/emu8000_synth.c
sound/isa/sb/sb16.c
sound/isa/sb/sb16_csp.c
sound/isa/sb/sb16_main.c
sound/isa/sb/sb8.c
sound/isa/sb/sb8_main.c
sound/isa/sb/sb8_midi.c
sound/isa/sb/sb_common.c
sound/isa/sb/sb_mixer.c
sound/isa/sc6000.c [new file with mode: 0644]
sound/isa/sscape.c
sound/isa/wavefront/Makefile
sound/isa/wavefront/wavefront_synth.c
sound/last.c
sound/pci/Kconfig
sound/pci/Makefile
sound/pci/ac97/Makefile
sound/pci/ac97/ac97_codec.c
sound/pci/ac97/ac97_id.h
sound/pci/ac97/ac97_local.h
sound/pci/ac97/ac97_patch.c
sound/pci/ac97/ac97_patch.h
sound/pci/ac97/ac97_pcm.c
sound/pci/ac97/ac97_proc.c
sound/pci/ac97/ak4531_codec.c
sound/pci/ali5451/Makefile
sound/pci/ali5451/ali5451.c
sound/pci/als4000.c
sound/pci/au88x0/au88x0.c
sound/pci/au88x0/au88x0_eq.c
sound/pci/au88x0/au88x0_mpu401.c
sound/pci/au88x0/au88x0_synth.c
sound/pci/bt87x.c
sound/pci/ca0106/ca0106.h
sound/pci/ca0106/ca0106_main.c
sound/pci/ca0106/ca0106_mixer.c
sound/pci/ca0106/ca_midi.c
sound/pci/ca0106/ca_midi.h
sound/pci/cmipci.c
sound/pci/cs4281.c
sound/pci/cs46xx/Makefile
sound/pci/cs46xx/cs46xx.c
sound/pci/cs46xx/cs46xx_lib.c
sound/pci/cs46xx/cs46xx_lib.h
sound/pci/cs46xx/dsp_spos.h
sound/pci/cs46xx/dsp_spos_scb_lib.c
sound/pci/cs5535audio/Makefile
sound/pci/cs5535audio/cs5535audio.c
sound/pci/cs5535audio/cs5535audio.h
sound/pci/cs5535audio/cs5535audio_pcm.c
sound/pci/cs5535audio/cs5535audio_pm.c
sound/pci/echoaudio/echoaudio.c
sound/pci/echoaudio/echoaudio_dsp.c
sound/pci/echoaudio/echoaudio_dsp.h
sound/pci/emu10k1/Makefile
sound/pci/emu10k1/emu10k1.c
sound/pci/emu10k1/emu10k1_main.c
sound/pci/emu10k1/emu10k1x.c
sound/pci/emu10k1/emufx.c
sound/pci/emu10k1/emumixer.c
sound/pci/emu10k1/emumpu401.c
sound/pci/emu10k1/emupcm.c
sound/pci/emu10k1/emuproc.c
sound/pci/emu10k1/io.c
sound/pci/emu10k1/irq.c
sound/pci/emu10k1/memory.c
sound/pci/emu10k1/p16v.c
sound/pci/emu10k1/voice.c
sound/pci/ens1370.c
sound/pci/es1938.c
sound/pci/es1968.c
sound/pci/fm801.c
sound/pci/hda/Makefile
sound/pci/hda/hda_codec.c
sound/pci/hda/hda_codec.h
sound/pci/hda/hda_generic.c
sound/pci/hda/hda_hwdep.c [new file with mode: 0644]
sound/pci/hda/hda_intel.c
sound/pci/hda/hda_local.h
sound/pci/hda/hda_patch.h
sound/pci/hda/hda_proc.c
sound/pci/hda/patch_analog.c
sound/pci/hda/patch_atihdmi.c
sound/pci/hda/patch_cmedia.c
sound/pci/hda/patch_conexant.c
sound/pci/hda/patch_realtek.c
sound/pci/hda/patch_si3054.c
sound/pci/hda/patch_sigmatel.c
sound/pci/hda/patch_via.c
sound/pci/ice1712/Makefile
sound/pci/ice1712/ak4xxx.c
sound/pci/ice1712/amp.c
sound/pci/ice1712/amp.h
sound/pci/ice1712/aureon.c
sound/pci/ice1712/delta.c
sound/pci/ice1712/delta.h
sound/pci/ice1712/envy24ht.h
sound/pci/ice1712/ews.c
sound/pci/ice1712/ews.h
sound/pci/ice1712/hoontech.c
sound/pci/ice1712/hoontech.h
sound/pci/ice1712/ice1712.c
sound/pci/ice1712/ice1712.h
sound/pci/ice1712/ice1724.c
sound/pci/ice1712/juli.c
sound/pci/ice1712/phase.c
sound/pci/ice1712/pontis.c
sound/pci/ice1712/prodigy192.c
sound/pci/ice1712/wtm.c
sound/pci/intel8x0.c
sound/pci/intel8x0m.c
sound/pci/korg1212/Makefile
sound/pci/korg1212/korg1212.c
sound/pci/maestro3.c
sound/pci/mixart/Makefile
sound/pci/mixart/mixart.c
sound/pci/mixart/mixart_mixer.c
sound/pci/nm256/Makefile
sound/pci/nm256/nm256.c
sound/pci/pcxhr/pcxhr.c
sound/pci/pcxhr/pcxhr_mixer.c
sound/pci/rme32.c
sound/pci/rme96.c
sound/pci/rme9652/Makefile
sound/pci/rme9652/hdsp.c
sound/pci/rme9652/hdspm.c
sound/pci/rme9652/rme9652.c
sound/pci/sonicvibes.c
sound/pci/trident/Makefile
sound/pci/trident/trident.c
sound/pci/trident/trident_main.c
sound/pci/trident/trident_memory.c
sound/pci/via82xx.c
sound/pci/via82xx_modem.c
sound/pci/vx222/Makefile
sound/pci/ymfpci/Makefile
sound/pci/ymfpci/ymfpci.c
sound/pci/ymfpci/ymfpci_main.c
sound/pcmcia/Makefile
sound/pcmcia/pdaudiocf/Makefile
sound/pcmcia/pdaudiocf/pdaudiocf.c
sound/pcmcia/pdaudiocf/pdaudiocf.h
sound/pcmcia/pdaudiocf/pdaudiocf_core.c
sound/pcmcia/pdaudiocf/pdaudiocf_irq.c
sound/pcmcia/pdaudiocf/pdaudiocf_pcm.c
sound/pcmcia/vx/Makefile
sound/pcmcia/vx/vxp_mixer.c
sound/ppc/Makefile
sound/ppc/daca.c
sound/ppc/pmac.c
sound/ppc/pmac.h
sound/ppc/snd_ps3.c
sound/sh/aica.c
sound/soc/codecs/Kconfig
sound/soc/codecs/Makefile
sound/soc/codecs/cs4270.c [new file with mode: 0644]
sound/soc/codecs/cs4270.h [new file with mode: 0644]
sound/soc/pxa/spitz.c
sound/soc/s3c24xx/Kconfig
sound/soc/s3c24xx/s3c24xx-i2s.c
sound/soc/s3c24xx/s3c24xx-pcm.c
sound/soc/soc-core.c
sound/soc/soc-dapm.c
sound/sparc/cs4231.c
sound/sparc/dbri.c
sound/spi/Kconfig [new file with mode: 0644]
sound/spi/Makefile [new file with mode: 0644]
sound/spi/at73c213.c [new file with mode: 0644]
sound/spi/at73c213.h [new file with mode: 0644]
sound/synth/Makefile
sound/synth/emux/Makefile
sound/synth/util_mem.c
sound/usb/Kconfig
sound/usb/caiaq/caiaq-audio.c
sound/usb/caiaq/caiaq-device.c
sound/usb/caiaq/caiaq-device.h
sound/usb/caiaq/caiaq-input.c
sound/usb/usbaudio.c
sound/usb/usbmidi.c
sound/usb/usbmixer.c
sound/usb/usbquirks.h

diff --git a/CREDITS b/CREDITS
index b90b4cac6e166aae6112399955d02c3bd7c068d5..08feda2667d031a079b1866f26f8fccce5baef0e 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -1933,7 +1933,7 @@ M: seasons@makosteszta.sote.hu
 D: Original author of software suspend
 
 N: Jaroslav Kysela
-E: perex@suse.cz
+E: perex@perex.cz
 W: http://www.perex.cz
 D: Original Author and Maintainer for HP 10/100 Mbit Network Adapters
 D: ISA PnP
index 241e26c4ff926d266b78ecd4f2b7eae706610b5f..4b48c2e82c3c1f340cf4cd7b4247d6d58941d162 100644 (file)
@@ -365,13 +365,14 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
   Module snd-cmipci
   -----------------
 
-    Module for C-Media CMI8338 and 8738 PCI sound cards.
+    Module for C-Media CMI8338/8738/8768/8770 PCI sound cards.
 
-    mpu_port   - 0x300,0x310,0x320,0x330 = legacy port,
-                 1 = integrated PCI port,
+    mpu_port    - port address of MIDI interface (8338 only):
+                 0x300,0x310,0x320,0x330 = legacy port,
                  0 = disable (default)
-    fm_port     - 0x388 = legacy port,
-                 1 = integrated PCI port (default),
+    fm_port     - port address of OPL-3 FM synthesizer (8x38 only):
+                 0x388 = legacy port,
+                 1 = integrated PCI port (default on 8738),
                  0 = disable
     soft_ac3    - Software-conversion of raw SPDIF packets (model 033 only)
                   (default = 1)
@@ -768,6 +769,10 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
     single_cmd  - Use single immediate commands to communicate with
                codecs (for debugging only)
     enable_msi - Enable Message Signaled Interrupt (MSI) (default = off)
+    power_save - Automatic power-saving timtout (in second, 0 =
+               disable)
+    power_save_controller - Reset HD-audio controller in power-saving mode
+               (default = on)
 
     This module supports one card and autoprobe.
 
@@ -828,6 +833,8 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
 
        ALC268
          3stack        3-stack model
+         toshiba       Toshiba A205
+         acer          Acer laptops
          auto          auto-config reading BIOS (default)
 
        ALC662
@@ -842,7 +849,11 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
          3stack-dig    3-jack with SPDIF I/O
          6stack-dig    6-jack digital with SPDIF I/O
          arima         Arima W820Di1
+         targa         Targa T8, MSI-1049 T8
+         asus-a7j      ASUS A7J
+         asus-a7m      ASUS A7M
          macpro        MacPro support
+         mbp3          Macbook Pro rev3
          imac24        iMac 24'' with jack detection
          w2jc          ASUS W2JC
          auto          auto-config reading BIOS (default)
@@ -854,6 +865,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
          3stack-6ch-dig 3-jack 6-channel with SPDIF I/O
          6stack-dig-demo  6-jack digital for Intel demo board
          acer          Acer laptops (Travelmate 3012WTMi, Aspire 5600, etc)
+         acer-aspire   Acer Aspire 9810
          medion        Medion Laptops
          medion-md2    Medion MD2
          targa-dig     Targa/MSI
@@ -862,6 +874,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
          lenovo-101e   Lenovo 101E
          lenovo-nb0763 Lenovo NB0763
          lenovo-ms7195-dig Lenovo MS7195
+         haier-w66     Haier W66
          6stack-hp     HP machines with 6stack (Nettle boards)
          3stack-hp     HP machines with 3stack (Lucknow, Samba boards)
          auto          auto-config reading BIOS (default)
@@ -885,6 +898,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
          3stack-660-digout 3-jack with SPDIF OUT (for ALC660VD)
          lenovo        Lenovo 3000 C200
          dallas        Dallas laptops
+         hp            HP TX1000
          auto          auto-config reading BIOS (default)
 
        CMI9880
@@ -920,6 +934,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
          3stack        3-stack, shared surrounds
          laptop        2-channel only (FSC V2060, Samsung M50)
          laptop-eapd   2-channel with EAPD (Samsung R65, ASUS A6J)
+         laptop-automute 2-channel with EAPD and HP-automute (Lenovo N100)
          ultra         2-channel with EAPD (Samsung Ultra tablet PC)
 
        AD1988
@@ -945,14 +960,30 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
                        can be adjusted.  Appearing only when compiled with
                        $CONFIG_SND_DEBUG=y
 
-       STAC9200/9205/9254
+       STAC9200
          ref           Reference board
+         dell-d21      Dell (unknown)
+         dell-d22      Dell (unknown)
+         dell-d23      Dell (unknown)
+         dell-m21      Dell Inspiron 630m, Dell Inspiron 640m
+         dell-m22      Dell Latitude D620, Dell Latitude D820
+         dell-m23      Dell XPS M1710, Dell Precision M90
+         dell-m24      Dell Latitude 120L
+         dell-m25      Dell Inspiron E1505n
+         dell-m26      Dell Inspiron 1501
+         dell-m27      Dell Inspiron E1705/9400
+         gateway       Gateway laptops with EAPD control
+
+       STAC9205/9254
+         ref           Reference board
+         dell-m42      Dell (unknown)
+         dell-m43      Dell Precision
+         dell-m44      Dell Inspiron
 
        STAC9220/9221
          ref           Reference board
          3stack        D945 3stack
          5stack        D945 5stack + SPDIF
-         dell          Dell XPS M1210
          intel-mac-v1  Intel Mac Type 1
          intel-mac-v2  Intel Mac Type 2
          intel-mac-v3  Intel Mac Type 3
@@ -964,6 +995,10 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
          macbook-pro   Intel Mac Book Pro 2nd generation (eq. type 3)
          imac-intel    Intel iMac (eq. type 2)
          imac-intel-20 Intel iMac (newer version) (eq. type 3)
+         dell-d81      Dell (unknown)
+         dell-d82      Dell (unknown)
+         dell-m81      Dell (unknown)
+         dell-m82      Dell XPS M1210
 
        STAC9202/9250/9251
          ref           Reference board, base config
@@ -975,6 +1010,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
          ref           Reference board
          3stack        D965 3stack
          5stack        D965 5stack + SPDIF
+         dell-3stack   Dell Dimension E520
 
        STAC9872
          vaio          Setup for VAIO FE550G/SZ110
@@ -989,6 +1025,9 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
     subsystem ID (output of "lspci -nv") to ALSA BTS or alsa-devel
     ML (see the section "Links and Addresses").
 
+    power_save and power_save_controller options are for power-saving
+    mode.  See powersave.txt for details.
+
     Note 2: If you get click noises on output, try the module option
            position_fix=1 or 2.  position_fix=1 will use the SD_LPIB
            register value without FIFO size correction as the current
@@ -1349,7 +1388,6 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
     port       - port number or -1 (disable)
     irq                - IRQ number or -1 (disable)
     pnp                - PnP detection - 0 = disable, 1 = enable (default)
-    uart_enter - Issue UART_ENTER command at open - bool, default = on
 
     This module supports multiple devices and PnP.
     
@@ -1630,6 +1668,21 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
     
     The power-management is supported.
 
+  Module snd-sc6000
+  -----------------
+
+    Module for Gallant SC-6000 soundcard.
+
+    port       - Port # (0x220 or 0x240)
+    mss_port   - MSS Port # (0x530 or 0xe80)
+    irq                - IRQ # (5,7,9,10,11)
+    mpu_irq    - MPU-401 IRQ # (5,7,9,10) ,0 - no MPU-401 irq
+    dma                - DMA # (1,3,0)
+
+    This module supports multiple cards.
+
+    This card is also known as Audio Excel DSP 16 or Zoltrix AV302.
+
   Module snd-sgalaxy
   ------------------
 
@@ -1650,9 +1703,11 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
     Module for ENSONIQ SoundScape PnP cards.
 
     port       - Port # (PnP setup)
+    wss_port   - WSS Port # (PnP setup)
     irq                - IRQ # (PnP setup)
     mpu_irq    - MPU-401 IRQ # (PnP setup)
     dma                - DMA # (PnP setup)
+    dma2       - 2nd DMA # (PnP setup, -1 to disable)
 
     This module supports multiple cards.  ISA PnP must be enabled.
     You need sscape_ctl tool in alsa-tools package for loading
@@ -1697,8 +1752,52 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
     dma2            - DMA2 # for CS4232 PCM interface.
     isapnp          - ISA PnP detection - 0 = disable, 1 = enable (default)
 
+    The below are options for wavefront_synth features:
+    wf_raw         - Assume that we need to boot the OS (default:no)
+       If yes, then during driver loading, the state of the board is
+       ignored, and we reset the board and load the firmware anyway.
+    fx_raw         - Assume that the FX process needs help (default:yes)
+       If false, we'll leave the FX processor in whatever state it is
+       when the driver is loaded.  The default is to download the
+       microprogram and associated coefficients to set it up for
+       "default" operation, whatever that means.
+    debug_default   - Debug parameters for card initialization
+    wait_usecs     - How long to wait without sleeping, usecs
+                     (default:150)
+       This magic number seems to give pretty optimal throughput
+       based on my limited experimentation. 
+       If you want to play around with it and find a better value, be
+       my guest. Remember, the idea is to get a number that causes us
+       to just busy wait for as many WaveFront commands as possible,
+       without coming up with a number so large that we hog the whole
+       CPU. 
+       Specifically, with this number, out of about 134,000 status
+       waits, only about 250 result in a sleep. 
+    sleep_interval  - How long to sleep when waiting for reply
+                     (default: 100)
+    sleep_tries            - How many times to try sleeping during a wait
+                     (default: 50)
+    ospath         - Pathname to processed ICS2115 OS firmware
+                     (default:wavefront.os)
+       The path name of the ISC2115 OS firmware.  In the recent
+       version, it's handled via firmware loader framework, so it
+       must be installed in the proper path, typically,
+       /lib/firmware.
+    reset_time     - How long to wait for a reset to take effect
+                     (default:2)
+    ramcheck_time   - How many seconds to wait for the RAM test
+                     (default:20)
+    osrun_time     - How many seconds to wait for the ICS2115 OS
+                     (default:10)
+
     This module supports multiple cards and ISA PnP.
 
+    Note: the firmware file "wavefront.os" was located in the earlier
+          version in /etc.  Now it's loaded via firmware loader, and
+         must be in the proper firmware path, such as /lib/firmware.
+         Copy (or symlink) the file appropriately if you get an error
+         regarding firmware downloading after upgrading the kernel.
+
   Module snd-sonicvibes
   ---------------------
 
index 4b2b1538705634797a5893c61ca7eda527f256a3..16935c8561f7b5d037192e66606607c9dedcaa1e 100644 (file)
@@ -1,5 +1,5 @@
-              Brief Notes on C-Media 8738/8338 Driver
-              =======================================
+         Brief Notes on C-Media 8338/8738/8768/8770 Driver
+         =================================================
 
                    Takashi Iwai <tiwai@suse.de>
 
@@ -209,10 +209,13 @@ In addition to the standard SB mixer, CM8x38 provides more functions.
 MIDI CONTROLLER
 ---------------
 
-The MPU401-UART interface is disabled as default.  You need to set
-module option "mpu_port" with a valid I/O port address to enable the
-MIDI support.  The valid I/O ports are 0x300, 0x310, 0x320 and 0x330.
-Choose the value which doesn't conflict with other cards.
+With CMI8338 chips, the MPU401-UART interface is disabled as default.
+You need to set the module option "mpu_port" to a valid I/O port address
+to enable MIDI support.  Valid I/O ports are 0x300, 0x310, 0x320 and
+0x330.  Choose a value that doesn't conflict with other cards.
+
+With CMI8738 and newer chips, the MIDI interface is enabled by default
+and the driver automatically chooses a port address.
 
 There is _no_ hardware wavetable function on this chip (except for
 OPL3 synth below).
@@ -230,6 +233,8 @@ Set "fm_port" module option for more cards.
 The output quality of FM OPL/3 is, however, very weird.
 I don't know why..
 
+CMI8768 and newer chips do not have the FM synth.
+
 
 Joystick and Modem
 ------------------
index 74d3a35b59bc699ba512cccf7f9aab3105fb6cec..2c3fc3cb3b6bdced5bf553b223719f8b370a6c26 100644 (file)
@@ -18,8 +18,8 @@
       </affiliation>
      </author>
 
-     <date>November 17, 2005</date>
-     <edition>0.3.6</edition>
+     <date>September 10, 2007</date>
+     <edition>0.3.7</edition>
 
     <abstract>
       <para>
   /* definition of the chip-specific record */
   struct mychip {
           struct snd_card *card;
-          // rest of implementation will be in the section
-          // "PCI Resource Managements"
+          /* rest of implementation will be in the section
+           * "PCI Resource Managements"
+           */
   };
 
   /* chip-specific destructor
    */
   static int snd_mychip_free(struct mychip *chip)
   {
-          .... // will be implemented later...
+          .... /* will be implemented later... */
   }
 
   /* component-destructor
 
           *rchip = NULL;
 
-          // check PCI availability here
-          // (see "PCI Resource Managements")
+          /* check PCI availability here
+           * (see "PCI Resource Managements")
+           */
           ....
 
           /* allocate a chip-specific data with zero filled */
 
           chip->card = card;
 
-          // rest of initialization here; will be implemented
-          // later, see "PCI Resource Managements"
+          /* rest of initialization here; will be implemented
+           * later, see "PCI Resource Managements"
+           */
           ....
 
-          if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL,
-                                    chip, &ops)) < 0) {
+          err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
+          if (err < 0) {
                   snd_mychip_free(chip);
                   return err;
           }
                   return -ENOMEM;
 
           /* (3) */
-          if ((err = snd_mychip_create(card, pci, &chip)) < 0) {
+          err = snd_mychip_create(card, pci, &chip);
+          if (err < 0) {
                   snd_card_free(card);
                   return err;
           }
                   card->shortname, chip->ioport, chip->irq);
 
           /* (5) */
-          .... // implemented later
+          .... /* implemented later */
 
           /* (6) */
-          if ((err = snd_card_register(card)) < 0) {
+          err = snd_card_register(card);
+          if (err < 0) {
                   snd_card_free(card);
                   return err;
           }
 <![CDATA[
   struct mychip *chip;
   ....
-  if ((err = snd_mychip_create(card, pci, &chip)) < 0) {
+  err = snd_mychip_create(card, pci, &chip);
+  if (err < 0) {
           snd_card_free(card);
           return err;
   }
           <informalexample>
             <programlisting>
 <![CDATA[
-  if ((err = snd_card_register(card)) < 0) {
+  err = snd_card_register(card);
+  if (err < 0) {
           snd_card_free(card);
           return err;
   }
   static int snd_mychip_free(struct mychip *chip)
   {
           /* disable hardware here if any */
-          .... // (not implemented in this document)
+          .... /* (not implemented in this document) */
 
           /* release the irq */
           if (chip->irq >= 0)
           *rchip = NULL;
 
           /* initialize the PCI entry */
-          if ((err = pci_enable_device(pci)) < 0)
+          err = pci_enable_device(pci);
+          if (err < 0)
                   return err;
           /* check PCI availability (28bit DMA) */
           if (pci_set_dma_mask(pci, DMA_28BIT_MASK) < 0 ||
           chip->irq = -1;
 
           /* (1) PCI resource allocation */
-          if ((err = pci_request_regions(pci, "My Chip")) < 0) {
+          err = pci_request_regions(pci, "My Chip");
+          if (err < 0) {
                   kfree(chip);
                   pci_disable_device(pci);
                   return err;
           chip->irq = pci->irq;
 
           /* (2) initialization of the chip hardware */
-          .... //   (not implemented in this document)
+          .... /*   (not implemented in this document) */
 
-          if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL,
-                                    chip, &ops)) < 0) {
+          err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
+          if (err < 0) {
                   snd_mychip_free(chip);
                   return err;
           }
         <informalexample>
           <programlisting>
 <![CDATA[
-  if ((err = pci_enable_device(pci)) < 0)
+  err = pci_enable_device(pci);
+  if (err < 0)
           return err;
   if (pci_set_dma_mask(pci, DMA_28BIT_MASK) < 0 ||
       pci_set_consistent_dma_mask(pci, DMA_28BIT_MASK) < 0) {
         <informalexample>
           <programlisting>
 <![CDATA[
-  if ((err = pci_request_regions(pci, "My Chip")) < 0) { 
+  err = pci_request_regions(pci, "My Chip");
+  if (err < 0) { 
           kfree(chip);
           pci_disable_device(pci);
           return err;
           <programlisting>
 <![CDATA[
   if (request_irq(pci->irq, snd_mychip_interrupt,
-                  IRQF_DISABLED|IRQF_SHARED, "My Chip", chip)) {
+                  IRQF_SHARED, "My Chip", chip)) {
           printk(KERN_ERR "cannot grab irq %d\n", pci->irq);
           snd_mychip_free(chip);
           return -EBUSY;
           struct snd_pcm_runtime *runtime = substream->runtime;
 
           runtime->hw = snd_mychip_playback_hw;
-          // more hardware-initialization will be done here
+          /* more hardware-initialization will be done here */
+          ....
           return 0;
   }
 
   static int snd_mychip_playback_close(struct snd_pcm_substream *substream)
   {
           struct mychip *chip = snd_pcm_substream_chip(substream);
-          // the hardware-specific codes will be here
+          /* the hardware-specific codes will be here */
+          ....
           return 0;
 
   }
           struct snd_pcm_runtime *runtime = substream->runtime;
 
           runtime->hw = snd_mychip_capture_hw;
-          // more hardware-initialization will be done here
+          /* more hardware-initialization will be done here */
+          ....
           return 0;
   }
 
   static int snd_mychip_capture_close(struct snd_pcm_substream *substream)
   {
           struct mychip *chip = snd_pcm_substream_chip(substream);
-          // the hardware-specific codes will be here
+          /* the hardware-specific codes will be here */
+          ....
           return 0;
 
   }
   {
           switch (cmd) {
           case SNDRV_PCM_TRIGGER_START:
-                  // do something to start the PCM engine
+                  /* do something to start the PCM engine */
+                  ....
                   break;
           case SNDRV_PCM_TRIGGER_STOP:
-                  // do something to stop the PCM engine
+                  /* do something to stop the PCM engine */
+                  ....
                   break;
           default:
                   return -EINVAL;
           struct snd_pcm *pcm;
           int err;
 
-          if ((err = snd_pcm_new(chip->card, "My Chip", 0, 1, 1,
-                                 &pcm)) < 0) 
+          err = snd_pcm_new(chip->card, "My Chip", 0, 1, 1, &pcm);
+          if (err < 0) 
                   return err;
           pcm->private_data = chip;
           strcpy(pcm->name, "My Chip");
           struct snd_pcm *pcm;
           int err;
 
-          if ((err = snd_pcm_new(chip->card, "My Chip", 0, 1, 1,
-                                 &pcm)) < 0) 
+          err = snd_pcm_new(chip->card, "My Chip", 0, 1, 1, &pcm);
+          if (err < 0) 
                   return err;
           pcm->private_data = chip;
           strcpy(pcm->name, "My Chip");
           struct mychip *chip = snd_pcm_chip(pcm);
           /* free your own data */
           kfree(chip->my_private_pcm_data);
-          // do what you like else
+          /* do what you like else */
           ....
   }
 
@@ -2884,10 +2901,10 @@ struct _snd_pcm_runtime {
 <![CDATA[
   switch (cmd) {
   case SNDRV_PCM_TRIGGER_START:
-          // do something to start the PCM engine
+          /* do something to start the PCM engine */
           break;
   case SNDRV_PCM_TRIGGER_STOP:
-          // do something to stop the PCM engine
+          /* do something to stop the PCM engine */
           break;
   default:
           return -EINVAL;
@@ -3071,7 +3088,7 @@ struct _snd_pcm_runtime {
                   spin_unlock(&chip->lock);
                   snd_pcm_period_elapsed(chip->substream);
                   spin_lock(&chip->lock);
-                  // acknowledge the interrupt if necessary
+                  /* acknowledge the interrupt if necessary */
           }
           ....
           spin_unlock(&chip->lock);
@@ -3134,7 +3151,7 @@ struct _snd_pcm_runtime {
                           snd_pcm_period_elapsed(substream);
                           spin_lock(&chip->lock);
                   }
-                  // acknowledge the interrupt if necessary
+                  /* acknowledge the interrupt if necessary */
           }
           ....
           spin_unlock(&chip->lock);
@@ -3455,6 +3472,13 @@ struct _snd_pcm_runtime {
       (casted to unsigned long) of some record to this field, too. 
       </para>
 
+      <para>
+      The <structfield>tlv</structfield> field can be used to provide
+      metadata about the control; see the
+      <link linkend="control-interface-tlv">
+      <citetitle>Metadata</citetitle></link> subsection.
+      </para>
+
       <para>
         The other three are
        <link linkend="control-interface-callbacks"><citetitle>
@@ -3604,7 +3628,7 @@ struct _snd_pcm_runtime {
            <title>Example of info callback</title>
             <programlisting>
 <![CDATA[
-  static int snd_myctl_info(struct snd_kcontrol *kcontrol,
+  static int snd_myctl_mono_info(struct snd_kcontrol *kcontrol,
                           struct snd_ctl_elem_info *uinfo)
   {
           uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
@@ -3639,7 +3663,7 @@ struct _snd_pcm_runtime {
           <informalexample>
             <programlisting>
 <![CDATA[
-  static int snd_myctl_info(struct snd_kcontrol *kcontrol,
+  static int snd_myctl_enum_info(struct snd_kcontrol *kcontrol,
                           struct snd_ctl_elem_info *uinfo)
   {
           static char *texts[4] = {
@@ -3658,6 +3682,16 @@ struct _snd_pcm_runtime {
             </programlisting>
           </informalexample>
         </para>
+
+        <para>
+         Some common info callbacks are prepared for easy use:
+       <function>snd_ctl_boolean_mono_info()</function> and
+       <function>snd_ctl_boolean_stereo_info()</function>.
+       Obviously, the former is an info callback for a mono channel
+       boolean item, just like <function>snd_myctl_mono_info</function>
+       above, and the latter is for a stereo channel boolean item.
+       </para>
+
       </section>
 
       <section id="control-interface-callbacks-get">
@@ -3794,7 +3828,8 @@ struct _snd_pcm_runtime {
         <informalexample>
           <programlisting>
 <![CDATA[
-  if ((err = snd_ctl_add(card, snd_ctl_new1(&my_control, chip))) < 0)
+  err = snd_ctl_add(card, snd_ctl_new1(&my_control, chip));
+  if (err < 0)
           return err;
 ]]>
           </programlisting>
@@ -3843,6 +3878,56 @@ struct _snd_pcm_runtime {
       </para>
     </section>
 
+    <section id="control-interface-tlv">
+      <title>Metadata</title>
+      <para>
+      To provide information about the dB values of a mixer control, use
+      on of the <constant>DECLARE_TLV_xxx</constant> macros from
+      <filename>&lt;sound/tlv.h&gt;</filename> to define a variable
+      containing this information, set the<structfield>tlv.p
+      </structfield> field to point to this variable, and include the
+      <constant>SNDRV_CTL_ELEM_ACCESS_TLV_READ</constant> flag in the
+      <structfield>access</structfield> field; like this:
+      <informalexample>
+        <programlisting>
+<![CDATA[
+  static DECLARE_TLV_DB_SCALE(db_scale_my_control, -4050, 150, 0);
+
+  static struct snd_kcontrol_new my_control __devinitdata = {
+          ...
+          .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
+                    SNDRV_CTL_ELEM_ACCESS_TLV_READ,
+          ...
+          .tlv.p = db_scale_my_control,
+  };
+]]>
+        </programlisting>
+      </informalexample>
+      </para>
+
+      <para>
+      The <function>DECLARE_TLV_DB_SCALE</function> macro defines
+      information about a mixer control where each step in the control's
+      value changes the dB value by a constant dB amount.
+      The first parameter is the name of the variable to be defined.
+      The second parameter is the minimum value, in units of 0.01 dB.
+      The third parameter is the step size, in units of 0.01 dB.
+      Set the fourth parameter to 1 if the minimum value actually mutes
+      the control.
+      </para>
+
+      <para>
+      The <function>DECLARE_TLV_DB_LINEAR</function> macro defines
+      information about a mixer control where the control's value affects
+      the output linearly.
+      The first parameter is the name of the variable to be defined.
+      The second parameter is the minimum value, in units of 0.01 dB.
+      The third parameter is the maximum value, in units of 0.01 dB.
+      If the minimum value mutes the control, set the second parameter to
+      <constant>TLV_DB_GAIN_MUTE</constant>.
+      </para>
+    </section>
+
   </chapter>
 
 
@@ -3880,7 +3965,7 @@ struct _snd_pcm_runtime {
   {
           struct mychip *chip = ac97->private_data;
           ....
-          // read a register value here from the codec
+          /* read a register value here from the codec */
           return the_register_value;
   }
 
@@ -3889,7 +3974,7 @@ struct _snd_pcm_runtime {
   {
           struct mychip *chip = ac97->private_data;
           ....
-          // write the given register value to the codec
+          /* write the given register value to the codec */
   }
 
   static int snd_mychip_ac97(struct mychip *chip)
@@ -3902,7 +3987,8 @@ struct _snd_pcm_runtime {
                   .read = snd_mychip_ac97_read,
           };
 
-          if ((err = snd_ac97_bus(chip->card, 0, &ops, NULL, &bus)) < 0)
+          err = snd_ac97_bus(chip->card, 0, &ops, NULL, &bus);
+          if (err < 0)
                   return err;
           memset(&ac97, 0, sizeof(ac97));
           ac97.private_data = chip;
@@ -4447,10 +4533,10 @@ struct _snd_pcm_runtime {
         <informalexample>
           <programlisting>
 <![CDATA[
-  struct list_head *list;
   struct snd_rawmidi_substream *substream;
-  list_for_each(list, &rmidi->streams[SNDRV_RAWMIDI_STREAM_OUTPUT].substreams) {
-          substream = list_entry(list, struct snd_rawmidi_substream, list);
+  list_for_each_entry(substream,
+                      &rmidi->streams[SNDRV_RAWMIDI_STREAM_OUTPUT].substreams,
+                      list {
           sprintf(substream->name, "My MIDI Port %d", substream->number + 1);
   }
   /* same for SNDRV_RAWMIDI_STREAM_INPUT */
index bfa0c9aacb4bf17ed6cf8548bab4fea31778b3f3..022aaeb0e9ddf3b461d1db2f63c6927d22479373 100644 (file)
@@ -303,10 +303,3 @@ ICE1712 supports only the unconventional format, interleaved
 the buffer as the conventional (mono or 2-channels, 8 or 16bit) format
 on OSS.
 
-USB devices
------------
-Some USB devices support only 24bit format packed in 3bytes.  This
-format is not supported by OSS and no conversion is provided by kernel
-OSS emulation.  You can use the user-space OSS emulation via libaoss
-instead.
-
index 4eaae2a45534184b678108dd515d31a2636b9aab..8e1b02526698c55da2c8da8964f480a108a53cb2 100644 (file)
@@ -49,6 +49,9 @@ struct hda_bus_ops {
                       unsigned int verb, unsigned int parm);
        unsigned int (*get_response)(struct hda_codec *codec);
        void (*private_free)(struct hda_bus *);
+#ifdef CONFIG_SND_HDA_POWER_SAVE
+       void (*pm_notify)(struct hda_codec *codec);
+#endif
 };
 
 The command callback is called when the codec module needs to send a
@@ -56,9 +59,16 @@ VERB to the controller.  It's always a single command.
 The get_response callback is called when the codec requires the answer
 for the last command.  These two callbacks are mandatory and have to
 be given.
-The last, private_free callback, is optional.  It's called in the
+The third, private_free callback, is optional.  It's called in the
 destructor to release any necessary data in the lowlevel driver.
 
+The pm_notify callback is available only with
+CONFIG_SND_HDA_POWER_SAVE kconfig.  It's called when the codec needs
+to power up or may power down.  The controller should check the all
+belonging codecs on the bus whether they are actually powered off
+(check codec->power_on), and optionally the driver may power down the
+contoller side, too.
+
 The bus instance is created via snd_hda_bus_new().  You need to pass
 the card instance, the template, and the pointer to store the
 resultant bus instance.
@@ -86,10 +96,8 @@ resultant codec instance (can be NULL if not needed).
 The codec is stored in a linked list of bus instance.  You can follow
 the codec list like:
 
-       struct list_head *p;
        struct hda_codec *codec;
-       list_for_each(p, &bus->codec_list) {
-               codec = list_entry(p, struct hda_codec, list);
+       list_for_each_entry(codec, &bus->codec_list, list) {
                ...
        }
 
@@ -100,10 +108,15 @@ initialization sequence is called when the controls are built later.
 Codec Access
 ============
 
-To access codec, use snd_codec_read() and snd_codec_write().
+To access codec, use snd_hda_codec_read() and snd_hda_codec_write().
 snd_hda_param_read() is for reading parameters.
 For writing a sequence of verbs, use snd_hda_sequence_write().
 
+There are variants of cached read/write, snd_hda_codec_write_cache(),
+snd_hda_sequence_write_cache().  These are used for recording the
+register states for the power-mangement resume.  When no PM is needed,
+these are equivalent with non-cached version.
+
 To retrieve the number of sub nodes connected to the given node, use
 snd_hda_get_sub_nodes().  The connection list can be obtained via
 snd_hda_get_connections() call.
@@ -239,6 +252,10 @@ set the codec->patch_ops field.  This is defined as below:
                int (*suspend)(struct hda_codec *codec, pm_message_t state);
                int (*resume)(struct hda_codec *codec);
        #endif
+       #ifdef CONFIG_SND_HDA_POWER_SAVE
+               int (*check_power_status)(struct hda_codec *codec,
+                                         hda_nid_t nid);
+       #endif
        };
 
 The build_controls callback is called from snd_hda_build_controls().
@@ -251,6 +268,18 @@ The unsol_event callback is called when an unsolicited event is
 received.
 
 The suspend and resume callbacks are for power management.
+They can be NULL if no special sequence is required.  When the resume
+callback is NULL, the driver calls the init callback and resumes the
+registers from the cache.  If other handling is needed, you'd need to
+write your own resume callback.  There, the amp values can be resumed
+via
+       void snd_hda_codec_resume_amp(struct hda_codec *codec);
+and the other codec registers via
+       void snd_hda_codec_resume_cache(struct hda_codec *codec);
+
+The check_power_status callback is called when the amp value of the
+given widget NID is changed.  The codec code can turn on/off the power
+appropriately from this information.
 
 Each entry can be NULL if not necessary to be called.
 
@@ -267,8 +296,7 @@ Digital I/O
 ===========
 
 Call snd_hda_create_spdif_out_ctls() from the patch to create controls
-related with SPDIF out.  In the patch resume callback, call
-snd_hda_resume_spdif().
+related with SPDIF out.
 
 
 Helper Functions
@@ -284,12 +312,7 @@ as a module parameter, and PCI subsystem IDs.  If the matching entry
 is found, it returns the config field value.
 
 snd_hda_add_new_ctls() can be used to create and add control entries.
-Pass the zero-terminated array of struct snd_kcontrol_new.  The same array
-can be passed to snd_hda_resume_ctls() for resume.
-Note that this will call control->put callback of these entries.  So,
-put callback should check codec->in_resume and force to restore the
-given value if it's non-zero even if the value is identical with the
-cached value.
+Pass the zero-terminated array of struct snd_kcontrol_new
 
 Macros HDA_CODEC_VOLUME(), HDA_CODEC_MUTE() and their variables can be
 used for the entry of struct snd_kcontrol_new.
diff --git a/Documentation/sound/alsa/powersave.txt b/Documentation/sound/alsa/powersave.txt
new file mode 100644 (file)
index 0000000..9657e80
--- /dev/null
@@ -0,0 +1,41 @@
+Notes on Power-Saving Mode
+==========================
+
+AC97 and HD-audio drivers have the automatic power-saving mode.
+This feature is enabled via Kconfig CONFIG_SND_AC97_POWER_SAVE
+and CONFIG_SND_HDA_POWER_SAVE options, respectively.
+
+With the automatic power-saving, the driver turns off the codec power
+appropriately when no operation is required.  When no applications use
+the device and/or no analog loopback is set, the power disablement is
+done fully or partially.  It'll save a certain power consumption, thus
+good for laptops (even for desktops).
+
+The time-out for automatic power-off can be specified via power_save
+module option of snd-ac97-codec and snd-hda-intel modules.  Specify
+the time-out value in seconds.  0 means to disable the automatic
+power-saving.  The default value of timeout is given via
+CONFIG_SND_AC97_POWER_SAVE_DEFAULT and
+CONFIG_SND_HDA_POWER_SAVE_DEFAULT Kconfig options.  Setting this to 1
+(the minimum value) isn't recommended because many applications try to
+reopen the device frequently.  10 would be a good choice for normal
+operations.
+
+The power_save option is exported as writable.  This means you can
+adjust the value via sysfs on the fly.  For example, to turn on the
+automatic power-save mode with 10 seconds, write to
+/sys/modules/snd_ac97_codec/parameters/power_save (usually as root):
+
+       # echo 10 > /sys/modules/snd_ac97_codec/parameters/power_save
+
+
+Note that you might hear click noise/pop when changing the power
+state.  Also, it often takes certain time to wake up from the
+power-down to the active state.  These are often hardly to fix, so
+don't report extra bug reports unless you have a fix patch ;-)
+
+For HD-audio interface, there is another module option,
+power_save_controller.  This enables/disables the power-save mode of
+the controller side.  Setting this on may reduce a bit more power
+consumption, but might result in longer wake-up time and click noise.
+Try to turn it off when you experience such a thing too often.
index c7355e7f09ff3e2e1bccc93f9d0c06b1484b0442..1315cca8fc5f848bb2b569f076d3fa043e15978f 100644 (file)
@@ -1769,7 +1769,7 @@ S:        Maintained
 
 HP100: Driver for HP 10/100 Mbit/s Voice Grade Network Adapter Series
 P:     Jaroslav Kysela
-M:     perex@suse.cz
+M:     perex@perex.cz
 S:     Maintained
 
 HPET:  High Precision Event Timers driver (hpet.c)
@@ -2132,7 +2132,7 @@ S:        Maintained
 
 ISAPNP
 P:     Jaroslav Kysela
-M:     perex@suse.cz
+M:     perex@perex.cz
 S:     Maintained
 
 ISDN SUBSYSTEM
@@ -3523,7 +3523,7 @@ S:        Maintained
 
 SOUND
 P:     Jaroslav Kysela
-M:     perex@suse.cz
+M:     perex@perex.cz
 L:     alsa-devel@alsa-project.org (subscribers-only)
 S:     Maintained
 
index 90c36c5705c368bfdb98525af9faf3c7e62d15f9..141dadf7cf1ba6ad9db266f01673129d28bba44c 100644 (file)
@@ -7,7 +7,7 @@
  *    (c) 2005,2006 Ricardo Cerqueira <v4l@cerqueira.org>
  *    (c) 2005 Mauro Carvalho Chehab <mchehab@infradead.org>
  *    Based on a dummy cx88 module by Gerd Knorr <kraxel@bytesex.org>
- *    Based on dummy.c by Jaroslav Kysela <perex@suse.cz>
+ *    Based on dummy.c by Jaroslav Kysela <perex@perex.cz>
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
index e4fde17e28418690483be105a8dfa4a684a9cced..49421d1cd3a5d61e1bb4afcd6533478fd8526e31 100644 (file)
@@ -8,7 +8,7 @@
 ** Extended for new busmaster capable chipsets by
 ** Siegfried "Frieder" Loeffler (dg1sek) <floeff@mathematik.uni-stuttgart.de>
 **
-** Maintained by: Jaroslav Kysela <perex@suse.cz>
+** Maintained by: Jaroslav Kysela <perex@perex.cz>
 **
 ** This driver has only been tested with
 ** -- HP J2585B 10/100 Mbit/s PCI Busmaster
@@ -2951,7 +2951,7 @@ static struct pci_driver hp100_pci_driver = {
  */
 
 MODULE_LICENSE("GPL");
-MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>, "
+MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>, "
               "Siegfried \"Frieder\" Loeffler (dg1sek) <floeff@mathematik.uni-stuttgart.de>");
 MODULE_DESCRIPTION("HP CASCADE Architecture Driver for 100VG-AnyLan Network Adapters");
 
index a0cfb75bbb8d72e82fbf74cfbd992ddce08f5245..e0ee28a88da3f90a1712c082e410d1a9ff42c8bc 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * interface.c - contains everything related to the user interface
  *
- * Some code, especially possible resource dumping is based on isapnp_proc.c (c) Jaroslav Kysela <perex@suse.cz>
+ * Some code, especially possible resource dumping is based on isapnp_proc.c (c) Jaroslav Kysela <perex@perex.cz>
  * Copyright 2002 Adam Belay <ambx1@neo.rr.com>
  */
 
index b035d60a1dccb00c88c9b284a0fd4d80462e7a49..2c925b7cd93e356fab3af1cfd3689199594904ec 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  ISA Plug & Play support
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
@@ -53,7 +53,7 @@ static int isapnp_rdp;                /* Read Data Port */
 static int isapnp_reset = 1;   /* reset all PnP cards (deactivate) */
 static int isapnp_verbose = 1; /* verbose mode */
 
-MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>");
+MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>");
 MODULE_DESCRIPTION("Generic ISA Plug & Play support");
 module_param(isapnp_disable, int, 0);
 MODULE_PARM_DESC(isapnp_disable, "ISA Plug & Play disable");
index 560ccb6408164b0cdee275f4160ff04ed085ce08..2b8266c3d40f63aced5da403e66d745970d18107 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  ISA Plug & Play support
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *
  *   This program is free software; you can redistribute it and/or modify
  *   it under the terms of the GNU General Public License as published by
index 0826287eef53b39fb30160cb3d0fb1047422539b..ea3eac2404cad0236b58df1f77be7866cbe0a074 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * manager.c - Resource Management, Conflict Resolution, Activation and Disabling of Devices
  *
- * based on isapnp.c resource management (c) Jaroslav Kysela <perex@suse.cz>
+ * based on isapnp.c resource management (c) Jaroslav Kysela <perex@perex.cz>
  * Copyright 2003 Adam Belay <ambx1@neo.rr.com>
  */
 
index ef1286900db3cf75c012cd99b4a76ce9ff4d1d11..087fed18628fd95fc146527883fd4deca67e0a8f 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * resource.c - Contains functions for registering and analyzing resource information
  *
- * based on isapnp.c resource management (c) Jaroslav Kysela <perex@suse.cz>
+ * based on isapnp.c resource management (c) Jaroslav Kysela <perex@perex.cz>
  * Copyright 2003 Adam Belay <ambx1@neo.rr.com>
  */
 
index a271b67a8e2d72cdf6adc68d64ff1a74703040fb..88c81403eb3ff8dbb4804e72c0fa65d28afe0691 100644 (file)
 #define I2C_DRIVERID_WM8753    91      /* Wolfson WM8753 audio codec */
 #define I2C_DRIVERID_LM4857    92      /* LM4857 Audio Amplifier */
 #define I2C_DRIVERID_VP27SMPX  93      /* Panasonic VP27s tuner internal MPX */
+#define I2C_DRIVERID_CS4270    94      /* Cirrus Logic 4270 audio codec */
 
 #define I2C_DRIVERID_I2CDEV    900
 #define I2C_DRIVERID_ARP        902    /* SMBus ARP Client              */
diff --git a/include/linux/spi/at73c213.h b/include/linux/spi/at73c213.h
new file mode 100644 (file)
index 0000000..0f20a70
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Board-specific data used to set up AT73c213 audio DAC driver.
+ */
+
+#ifndef __LINUX_SPI_AT73C213_H
+#define __LINUX_SPI_AT73C213_H
+
+/**
+ * at73c213_board_info - how the external DAC is wired to the device.
+ *
+ * @ssc_id: SSC platform_driver id the DAC shall use to stream the audio.
+ * @dac_clk: the external clock used to provide master clock to the DAC.
+ * @shortname: a short discription for the DAC, seen by userspace tools.
+ *
+ * This struct contains the configuration of the hardware connection to the
+ * external DAC. The DAC needs a master clock and a I2S audio stream. It also
+ * provides a name which is used to identify it in userspace tools.
+ */
+struct at73c213_board_info {
+       int             ssc_id;
+       struct clk      *dac_clk;
+       char            shortname[32];
+};
+
+#endif /* __LINUX_SPI_AT73C213_H */
index 246ac23534bdeae9693032f5ee09ac88ffbc91fe..01480581f825c6886b990972104c7541dcc837a5 100644 (file)
@@ -2,7 +2,7 @@
 #define __SOUND_AC97_CODEC_H
 
 /*
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *  Universal interface for Audio Codec '97
  *
  *  For more details look to AC '97 component specification revision 2.1
 #define AC97_ALC650_GPIO_STATUS                0x78
 #define AC97_ALC650_CLOCK              0x7a
 
-/* specific - Yamaha YMF753 */
-#define AC97_YMF753_DIT_CTRL2  0x66    /* DIT Control 2 */
-#define AC97_YMF753_3D_MODE_SEL        0x68    /* 3D Mode Select */
+/* specific - Yamaha YMF7x3 */
+#define AC97_YMF7X3_DIT_CTRL   0x66    /* DIT Control (YMF743) / 2 (YMF753) */
+#define AC97_YMF7X3_3D_MODE_SEL        0x68    /* 3D Mode Select */
 
 /* specific - C-Media */
 #define AC97_CM9738_VENDOR_CTRL        0x5a
index b2c3f00a9b3537d808ac307daa4b61ad4f7b4a42..d04f9e78c7c130f3732cb7546efa0f617c296853 100644 (file)
@@ -2,7 +2,7 @@
 #define __SOUND_AD1848_H
 
 /*
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *  Definitions for AD1847/AD1848/CS4248 chips
  *
  *
@@ -27,7 +27,7 @@
 
 /* IO ports */
 
-#define AD1848P( codec, x ) ( (chip) -> port + c_d_c_AD1848##x )
+#define AD1848P( chip, x ) ( (chip) -> port + c_d_c_AD1848##x )
 
 #define c_d_c_AD1848REGSEL     0
 #define c_d_c_AD1848REG                1
@@ -154,7 +154,6 @@ struct snd_ad1848 {
 #endif
 
        spinlock_t reg_lock;
-       struct mutex open_mutex;
 };
 
 /* exported functions */
index 47726fe0f46d7c087571e88b3278f194f3e3bdab..b62b665c69c6c31c7c7887f79de4a32533f55846 100644 (file)
@@ -2,7 +2,7 @@
  *  Advanced Linux Sound Architecture
  *
  *  GF1 (GUS) Patch Instrument Format
- *  Copyright (c) 1994-99 by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) 1994-99 by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
index 251feaf1b388e81eb193a4db09633ae9e12a9679..11bd250826006213b33e23fbaadeda035587618c 100644 (file)
@@ -2,7 +2,7 @@
  *  Advanced Linux Sound Architecture
  *
  *  InterWave FFFF Instrument Format
- *  Copyright (c) 1994-99 by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) 1994-99 by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
index 5eead12e58ae55ca43b274d06a3838fcb02bb890..da08e72875575749443dc3f8a0f6b77cf2eaac04 100644 (file)
@@ -2,7 +2,7 @@
  *  Advanced Linux Sound Architecture
  *
  *  Simple (MOD player) Instrument Format
- *  Copyright (c) 1994-99 by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) 1994-99 by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
index d647dae912b9fcd3be483c0493b43b3f1f14b158..4e80d3fe738130c7cefad9673c771a756df2de8b 100644 (file)
@@ -3,7 +3,7 @@
 
 /*
  *  Routines for Asahi Kasei AK4114
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>,
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>,
  *
  *
  *   This program is free software; you can redistribute it and/or modify
index d650d52e3d296429d9c8ee75e5f0f7d80336aa37..1e8178171baf0a61bebba17c1d1d6d44d33a9cdf 100644 (file)
@@ -3,7 +3,7 @@
 
 /*
  *  Routines for Asahi Kasei AK4117
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>,
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>,
  *
  *
  *   This program is free software; you can redistribute it and/or modify
index fb30faab43a83186279ef037e515ae9815f4eea3..575296cf79877ecf7f649079f634c731eec24939 100644 (file)
@@ -2,7 +2,7 @@
 #define __SOUND_AK4531_CODEC_H
 
 /*
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *  Universal interface for Audio Codec '97
  *
  *  For more details look to AC '97 component specification revision 2.1
index fd0a6c46f497e69946137621a4f5ae7cf049125c..891cf1aea8b139db918705149a9e7ffb25760fd5 100644 (file)
@@ -5,7 +5,7 @@
  *   ALSA driver for AK4524 / AK4528 / AK4529 / AK4355 / AK4381
  *   AD and DA converters
  *
- *     Copyright (c) 2000 Jaroslav Kysela <perex@suse.cz>
+ *     Copyright (c) 2000 Jaroslav Kysela <perex@perex.cz>
  *
  *   This program is free software; you can redistribute it and/or modify
  *   it under the terms of the GNU General Public License as published by
index 3f2f4042a20dddeec4b11aea909e0a2d4df94e69..64daccbe8b29196f7969631bf0d44e69200f2ca3 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *  Main header file for the ALSA sequencer
  *  Copyright (c) 1998-1999 by Frank van de Pol <fvdpol@coil.demon.nl>
- *            (c) 1998-1999 by Jaroslav Kysela <perex@suse.cz>
+ *            (c) 1998-1999 by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
index c1621c650a9a084988b26d3bb14fb428fb38ea4e..af9d11d315e94c272b4eb32a6932b817add375b3 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Advanced Linux Sound Architecture - ALSA - Driver
- *  Copyright (c) 1994-2003 by Jaroslav Kysela <perex@suse.cz>,
+ *  Copyright (c) 1994-2003 by Jaroslav Kysela <perex@perex.cz>,
  *                             Abramo Bagnara <abramo@alsa-project.org>
  *
  *
@@ -92,6 +92,7 @@ enum {
        SNDRV_HWDEP_IFACE_USX2Y_PCM,    /* Tascam US122, US224 & US428 rawusb pcm */
        SNDRV_HWDEP_IFACE_PCXHR,        /* Digigram PCXHR */
        SNDRV_HWDEP_IFACE_SB_RC,        /* SB Extigy/Audigy2NX remote control */
+       SNDRV_HWDEP_IFACE_HDA,          /* HD-audio */
 
        /* Don't forget to change the following: */
        SNDRV_HWDEP_IFACE_LAST = SNDRV_HWDEP_IFACE_SB_RC
index 956fdc23c5957175a0dbf7796d3409686ba9bef6..8fbcab7cc73b6f6b455259295069ab4f9d3dc536 100644 (file)
@@ -5,7 +5,7 @@
  *  Advanced Linux Sound Architecture - ALSA
  *
  *  Interface file between ALSA driver & user space
- *  Copyright (c) 1994-98 by Jaroslav Kysela <perex@suse.cz>,
+ *  Copyright (c) 1994-98 by Jaroslav Kysela <perex@perex.cz>,
  *                           4Front Technologies
  *
  *  Direct FM control
index 58c9ef3d18253d169cf6b0b071e24f171b72f790..024ce62f7d16799462fb8083f86d7f9643c71d4d 100644 (file)
@@ -3,7 +3,7 @@
 
 /*
  *  Advanced Linux Sound Architecture - ALSA - Driver
- *  Copyright (c) 1994-2000 by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) 1994-2000 by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
index 72e759f619b10633526c787287f881b158929884..e79baa63912f018ad2e600b5e9db893427dede9b 100644 (file)
@@ -3,7 +3,7 @@
 
 /*
  *  Header file for control interface
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
@@ -161,4 +161,12 @@ static inline struct snd_ctl_elem_id *snd_ctl_build_ioff(struct snd_ctl_elem_id
        return dst_id;
 }
 
+/*
+ * Frequently used control callbacks
+ */
+int snd_ctl_boolean_mono_info(struct snd_kcontrol *kcontrol,
+                             struct snd_ctl_elem_info *uinfo);
+int snd_ctl_boolean_stereo_info(struct snd_kcontrol *kcontrol,
+                               struct snd_ctl_elem_info *uinfo);
+
 #endif /* __SOUND_CONTROL_H */
index 4b9e609975ab976e5dceb554ef7401e30d5b3daf..6954836487ed3407e217a3d005057ee77a8ad7c1 100644 (file)
@@ -3,7 +3,7 @@
 
 /*
  *  Main header file for the ALSA driver
- *  Copyright (c) 1994-2001 by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) 1994-2001 by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
diff --git a/include/sound/cs4231-regs.h b/include/sound/cs4231-regs.h
new file mode 100644 (file)
index 0000000..f149026
--- /dev/null
@@ -0,0 +1,180 @@
+#ifndef __SOUND_CS4231_REGS_H
+#define __SOUND_CS4231_REGS_H
+
+/*
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
+ *  Definitions for CS4231 & InterWave chips & compatible chips registers
+ *
+ *
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+ *
+ */
+
+/* IO ports */
+
+#define CS4231P(x)             (c_d_c_CS4231##x)
+
+#define c_d_c_CS4231REGSEL     0
+#define c_d_c_CS4231REG                1
+#define c_d_c_CS4231STATUS     2
+#define c_d_c_CS4231PIO                3
+
+/* codec registers */
+
+#define CS4231_LEFT_INPUT      0x00    /* left input control */
+#define CS4231_RIGHT_INPUT     0x01    /* right input control */
+#define CS4231_AUX1_LEFT_INPUT 0x02    /* left AUX1 input control */
+#define CS4231_AUX1_RIGHT_INPUT        0x03    /* right AUX1 input control */
+#define CS4231_AUX2_LEFT_INPUT 0x04    /* left AUX2 input control */
+#define CS4231_AUX2_RIGHT_INPUT        0x05    /* right AUX2 input control */
+#define CS4231_LEFT_OUTPUT     0x06    /* left output control register */
+#define CS4231_RIGHT_OUTPUT    0x07    /* right output control register */
+#define CS4231_PLAYBK_FORMAT   0x08    /* clock and data format - playback - bits 7-0 MCE */
+#define CS4231_IFACE_CTRL      0x09    /* interface control - bits 7-2 MCE */
+#define CS4231_PIN_CTRL                0x0a    /* pin control */
+#define CS4231_TEST_INIT       0x0b    /* test and initialization */
+#define CS4231_MISC_INFO       0x0c    /* miscellaneaous information */
+#define CS4231_LOOPBACK                0x0d    /* loopback control */
+#define CS4231_PLY_UPR_CNT     0x0e    /* playback upper base count */
+#define CS4231_PLY_LWR_CNT     0x0f    /* playback lower base count */
+#define CS4231_ALT_FEATURE_1   0x10    /* alternate #1 feature enable */
+#define AD1845_AF1_MIC_LEFT    0x10    /* alternate #1 feature + MIC left */
+#define CS4231_ALT_FEATURE_2   0x11    /* alternate #2 feature enable */
+#define AD1845_AF2_MIC_RIGHT   0x11    /* alternate #2 feature + MIC right */
+#define CS4231_LEFT_LINE_IN    0x12    /* left line input control */
+#define CS4231_RIGHT_LINE_IN   0x13    /* right line input control */
+#define CS4231_TIMER_LOW       0x14    /* timer low byte */
+#define CS4231_TIMER_HIGH      0x15    /* timer high byte */
+#define CS4231_LEFT_MIC_INPUT  0x16    /* left MIC input control register (InterWave only) */
+#define AD1845_UPR_FREQ_SEL    0x16    /* upper byte of frequency select */
+#define CS4231_RIGHT_MIC_INPUT 0x17    /* right MIC input control register (InterWave only) */
+#define AD1845_LWR_FREQ_SEL    0x17    /* lower byte of frequency select */
+#define CS4236_EXT_REG         0x17    /* extended register access */
+#define CS4231_IRQ_STATUS      0x18    /* irq status register */
+#define CS4231_LINE_LEFT_OUTPUT        0x19    /* left line output control register (InterWave only) */
+#define CS4231_VERSION         0x19    /* CS4231(A) - version values */
+#define CS4231_MONO_CTRL       0x1a    /* mono input/output control */
+#define CS4231_LINE_RIGHT_OUTPUT 0x1b  /* right line output control register (InterWave only) */
+#define AD1845_PWR_DOWN                0x1b    /* power down control */
+#define CS4235_LEFT_MASTER     0x1b    /* left master output control */
+#define CS4231_REC_FORMAT      0x1c    /* clock and data format - record - bits 7-0 MCE */
+#define CS4231_PLY_VAR_FREQ    0x1d    /* playback variable frequency */
+#define AD1845_CLOCK           0x1d    /* crystal clock select and total power down */
+#define CS4235_RIGHT_MASTER    0x1d    /* right master output control */
+#define CS4231_REC_UPR_CNT     0x1e    /* record upper count */
+#define CS4231_REC_LWR_CNT     0x1f    /* record lower count */
+
+/* definitions for codec register select port - CODECP( REGSEL ) */
+
+#define CS4231_INIT            0x80    /* CODEC is initializing */
+#define CS4231_MCE             0x40    /* mode change enable */
+#define CS4231_TRD             0x20    /* transfer request disable */
+
+/* definitions for codec status register - CODECP( STATUS ) */
+
+#define CS4231_GLOBALIRQ       0x01    /* IRQ is active */
+
+/* definitions for codec irq status */
+
+#define CS4231_PLAYBACK_IRQ    0x10
+#define CS4231_RECORD_IRQ      0x20
+#define CS4231_TIMER_IRQ       0x40
+#define CS4231_ALL_IRQS                0x70
+#define CS4231_REC_UNDERRUN    0x08
+#define CS4231_REC_OVERRUN     0x04
+#define CS4231_PLY_OVERRUN     0x02
+#define CS4231_PLY_UNDERRUN    0x01
+
+/* definitions for CS4231_LEFT_INPUT and CS4231_RIGHT_INPUT registers */
+
+#define CS4231_ENABLE_MIC_GAIN 0x20
+
+#define CS4231_MIXS_LINE       0x00
+#define CS4231_MIXS_AUX1       0x40
+#define CS4231_MIXS_MIC                0x80
+#define CS4231_MIXS_ALL                0xc0
+
+/* definitions for clock and data format register - CS4231_PLAYBK_FORMAT */
+
+#define CS4231_LINEAR_8                0x00    /* 8-bit unsigned data */
+#define CS4231_ALAW_8          0x60    /* 8-bit A-law companded */
+#define CS4231_ULAW_8          0x20    /* 8-bit U-law companded */
+#define CS4231_LINEAR_16       0x40    /* 16-bit twos complement data - little endian */
+#define CS4231_LINEAR_16_BIG   0xc0    /* 16-bit twos complement data - big endian */
+#define CS4231_ADPCM_16                0xa0    /* 16-bit ADPCM */
+#define CS4231_STEREO          0x10    /* stereo mode */
+/* bits 3-1 define frequency divisor */
+#define CS4231_XTAL1           0x00    /* 24.576 crystal */
+#define CS4231_XTAL2           0x01    /* 16.9344 crystal */
+
+/* definitions for interface control register - CS4231_IFACE_CTRL */
+
+#define CS4231_RECORD_PIO      0x80    /* record PIO enable */
+#define CS4231_PLAYBACK_PIO    0x40    /* playback PIO enable */
+#define CS4231_CALIB_MODE      0x18    /* calibration mode bits */
+#define CS4231_AUTOCALIB       0x08    /* auto calibrate */
+#define CS4231_SINGLE_DMA      0x04    /* use single DMA channel */
+#define CS4231_RECORD_ENABLE   0x02    /* record enable */
+#define CS4231_PLAYBACK_ENABLE 0x01    /* playback enable */
+
+/* definitions for pin control register - CS4231_PIN_CTRL */
+
+#define CS4231_IRQ_ENABLE      0x02    /* enable IRQ */
+#define CS4231_XCTL1           0x40    /* external control #1 */
+#define CS4231_XCTL0           0x80    /* external control #0 */
+
+/* definitions for test and init register - CS4231_TEST_INIT */
+
+#define CS4231_CALIB_IN_PROGRESS 0x20  /* auto calibrate in progress */
+#define CS4231_DMA_REQUEST     0x10    /* DMA request in progress */
+
+/* definitions for misc control register - CS4231_MISC_INFO */
+
+#define CS4231_MODE2           0x40    /* MODE 2 */
+#define CS4231_IW_MODE3                0x6c    /* MODE 3 - InterWave enhanced mode */
+#define CS4231_4236_MODE3      0xe0    /* MODE 3 - CS4236+ enhanced mode */
+
+/* definitions for alternate feature 1 register - CS4231_ALT_FEATURE_1 */
+
+#define        CS4231_DACZ             0x01    /* zero DAC when underrun */
+#define CS4231_TIMER_ENABLE    0x40    /* codec timer enable */
+#define CS4231_OLB             0x80    /* output level bit */
+
+/* definitions for Extended Registers - CS4236+ */
+
+#define CS4236_REG(i23val)     (((i23val << 2) & 0x10) | ((i23val >> 4) & 0x0f))
+#define CS4236_I23VAL(reg)     ((((reg)&0xf) << 4) | (((reg)&0x10) >> 2) | 0x8)
+
+#define CS4236_LEFT_LINE       0x08    /* left LINE alternate volume */
+#define CS4236_RIGHT_LINE      0x18    /* right LINE alternate volume */
+#define CS4236_LEFT_MIC                0x28    /* left MIC volume */
+#define CS4236_RIGHT_MIC       0x38    /* right MIC volume */
+#define CS4236_LEFT_MIX_CTRL   0x48    /* synthesis and left input mixer control */
+#define CS4236_RIGHT_MIX_CTRL  0x58    /* right input mixer control */
+#define CS4236_LEFT_FM         0x68    /* left FM volume */
+#define CS4236_RIGHT_FM                0x78    /* right FM volume */
+#define CS4236_LEFT_DSP                0x88    /* left DSP serial port volume */
+#define CS4236_RIGHT_DSP       0x98    /* right DSP serial port volume */
+#define CS4236_RIGHT_LOOPBACK  0xa8    /* right loopback monitor volume */
+#define CS4236_DAC_MUTE                0xb8    /* DAC mute and IFSE enable */
+#define CS4236_ADC_RATE                0xc8    /* indenpendent ADC sample frequency */
+#define CS4236_DAC_RATE                0xd8    /* indenpendent DAC sample frequency */
+#define CS4236_LEFT_MASTER     0xe8    /* left master digital audio volume */
+#define CS4236_RIGHT_MASTER    0xf8    /* right master digital audio volume */
+#define CS4236_LEFT_WAVE       0x0c    /* left wavetable serial port volume */
+#define CS4236_RIGHT_WAVE      0x1c    /* right wavetable serial port volume */
+#define CS4236_VERSION         0x9c    /* chip version and ID */
+
+#endif /* __SOUND_CS4231_REGS_H */
index ab51ce1ba9a5484acef339bd72b3688c8dbb1470..66055d702aa3cadf6c77544a31df05ff248960f9 100644 (file)
@@ -2,7 +2,7 @@
 #define __SOUND_CS4231_H
 
 /*
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *  Definitions for CS4231 & InterWave chips & compatible chips
  *
  *
 #include "pcm.h"
 #include "timer.h"
 
-/* IO ports */
-
-#define CS4231P(x)             (c_d_c_CS4231##x)
-
-#define c_d_c_CS4231REGSEL     0
-#define c_d_c_CS4231REG                1
-#define c_d_c_CS4231STATUS     2
-#define c_d_c_CS4231PIO                3
-
-/* codec registers */
-
-#define CS4231_LEFT_INPUT      0x00    /* left input control */
-#define CS4231_RIGHT_INPUT     0x01    /* right input control */
-#define CS4231_AUX1_LEFT_INPUT 0x02    /* left AUX1 input control */
-#define CS4231_AUX1_RIGHT_INPUT        0x03    /* right AUX1 input control */
-#define CS4231_AUX2_LEFT_INPUT 0x04    /* left AUX2 input control */
-#define CS4231_AUX2_RIGHT_INPUT        0x05    /* right AUX2 input control */
-#define CS4231_LEFT_OUTPUT     0x06    /* left output control register */
-#define CS4231_RIGHT_OUTPUT    0x07    /* right output control register */
-#define CS4231_PLAYBK_FORMAT   0x08    /* clock and data format - playback - bits 7-0 MCE */
-#define CS4231_IFACE_CTRL      0x09    /* interface control - bits 7-2 MCE */
-#define CS4231_PIN_CTRL                0x0a    /* pin control */
-#define CS4231_TEST_INIT       0x0b    /* test and initialization */
-#define CS4231_MISC_INFO       0x0c    /* miscellaneaous information */
-#define CS4231_LOOPBACK                0x0d    /* loopback control */
-#define CS4231_PLY_UPR_CNT     0x0e    /* playback upper base count */
-#define CS4231_PLY_LWR_CNT     0x0f    /* playback lower base count */
-#define CS4231_ALT_FEATURE_1   0x10    /* alternate #1 feature enable */
-#define AD1845_AF1_MIC_LEFT    0x10    /* alternate #1 feature + MIC left */
-#define CS4231_ALT_FEATURE_2   0x11    /* alternate #2 feature enable */
-#define AD1845_AF2_MIC_RIGHT   0x11    /* alternate #2 feature + MIC right */
-#define CS4231_LEFT_LINE_IN    0x12    /* left line input control */
-#define CS4231_RIGHT_LINE_IN   0x13    /* right line input control */
-#define CS4231_TIMER_LOW       0x14    /* timer low byte */
-#define CS4231_TIMER_HIGH      0x15    /* timer high byte */
-#define CS4231_LEFT_MIC_INPUT  0x16    /* left MIC input control register (InterWave only) */
-#define AD1845_UPR_FREQ_SEL    0x16    /* upper byte of frequency select */
-#define CS4231_RIGHT_MIC_INPUT 0x17    /* right MIC input control register (InterWave only) */
-#define AD1845_LWR_FREQ_SEL    0x17    /* lower byte of frequency select */
-#define CS4236_EXT_REG         0x17    /* extended register access */
-#define CS4231_IRQ_STATUS      0x18    /* irq status register */
-#define CS4231_LINE_LEFT_OUTPUT        0x19    /* left line output control register (InterWave only) */
-#define CS4231_VERSION         0x19    /* CS4231(A) - version values */
-#define CS4231_MONO_CTRL       0x1a    /* mono input/output control */
-#define CS4231_LINE_RIGHT_OUTPUT 0x1b  /* right line output control register (InterWave only) */
-#define AD1845_PWR_DOWN                0x1b    /* power down control */
-#define CS4235_LEFT_MASTER     0x1b    /* left master output control */
-#define CS4231_REC_FORMAT      0x1c    /* clock and data format - record - bits 7-0 MCE */
-#define CS4231_PLY_VAR_FREQ    0x1d    /* playback variable frequency */
-#define AD1845_CLOCK           0x1d    /* crystal clock select and total power down */
-#define CS4235_RIGHT_MASTER    0x1d    /* right master output control */
-#define CS4231_REC_UPR_CNT     0x1e    /* record upper count */
-#define CS4231_REC_LWR_CNT     0x1f    /* record lower count */
-
-/* definitions for codec register select port - CODECP( REGSEL ) */
-
-#define CS4231_INIT            0x80    /* CODEC is initializing */
-#define CS4231_MCE             0x40    /* mode change enable */
-#define CS4231_TRD             0x20    /* transfer request disable */
-
-/* definitions for codec status register - CODECP( STATUS ) */
-
-#define CS4231_GLOBALIRQ       0x01    /* IRQ is active */
-
-/* definitions for codec irq status */
-
-#define CS4231_PLAYBACK_IRQ    0x10
-#define CS4231_RECORD_IRQ      0x20
-#define CS4231_TIMER_IRQ       0x40
-#define CS4231_ALL_IRQS                0x70
-#define CS4231_REC_UNDERRUN    0x08
-#define CS4231_REC_OVERRUN     0x04
-#define CS4231_PLY_OVERRUN     0x02
-#define CS4231_PLY_UNDERRUN    0x01
-
-/* definitions for CS4231_LEFT_INPUT and CS4231_RIGHT_INPUT registers */
-
-#define CS4231_ENABLE_MIC_GAIN 0x20
-
-#define CS4231_MIXS_LINE       0x00
-#define CS4231_MIXS_AUX1       0x40
-#define CS4231_MIXS_MIC                0x80
-#define CS4231_MIXS_ALL                0xc0
-
-/* definitions for clock and data format register - CS4231_PLAYBK_FORMAT */
-
-#define CS4231_LINEAR_8                0x00    /* 8-bit unsigned data */
-#define CS4231_ALAW_8          0x60    /* 8-bit A-law companded */
-#define CS4231_ULAW_8          0x20    /* 8-bit U-law companded */
-#define CS4231_LINEAR_16       0x40    /* 16-bit twos complement data - little endian */
-#define CS4231_LINEAR_16_BIG   0xc0    /* 16-bit twos complement data - big endian */
-#define CS4231_ADPCM_16                0xa0    /* 16-bit ADPCM */
-#define CS4231_STEREO          0x10    /* stereo mode */
-/* bits 3-1 define frequency divisor */
-#define CS4231_XTAL1           0x00    /* 24.576 crystal */
-#define CS4231_XTAL2           0x01    /* 16.9344 crystal */
-
-/* definitions for interface control register - CS4231_IFACE_CTRL */
-
-#define CS4231_RECORD_PIO      0x80    /* record PIO enable */
-#define CS4231_PLAYBACK_PIO    0x40    /* playback PIO enable */
-#define CS4231_CALIB_MODE      0x18    /* calibration mode bits */
-#define CS4231_AUTOCALIB       0x08    /* auto calibrate */
-#define CS4231_SINGLE_DMA      0x04    /* use single DMA channel */
-#define CS4231_RECORD_ENABLE   0x02    /* record enable */
-#define CS4231_PLAYBACK_ENABLE 0x01    /* playback enable */
-
-/* definitions for pin control register - CS4231_PIN_CTRL */
-
-#define CS4231_IRQ_ENABLE      0x02    /* enable IRQ */
-#define CS4231_XCTL1           0x40    /* external control #1 */
-#define CS4231_XCTL0           0x80    /* external control #0 */
-
-/* definitions for test and init register - CS4231_TEST_INIT */
-
-#define CS4231_CALIB_IN_PROGRESS 0x20  /* auto calibrate in progress */
-#define CS4231_DMA_REQUEST     0x10    /* DMA request in progress */
-
-/* definitions for misc control register - CS4231_MISC_INFO */
-
-#define CS4231_MODE2           0x40    /* MODE 2 */
-#define CS4231_IW_MODE3                0x6c    /* MODE 3 - InterWave enhanced mode */
-#define CS4231_4236_MODE3      0xe0    /* MODE 3 - CS4236+ enhanced mode */
-
-/* definitions for alternate feature 1 register - CS4231_ALT_FEATURE_1 */
-
-#define        CS4231_DACZ             0x01    /* zero DAC when underrun */
-#define CS4231_TIMER_ENABLE    0x40    /* codec timer enable */
-#define CS4231_OLB             0x80    /* output level bit */
-
-/* definitions for Extended Registers - CS4236+ */
-
-#define CS4236_REG(i23val)     (((i23val << 2) & 0x10) | ((i23val >> 4) & 0x0f))
-#define CS4236_I23VAL(reg)     ((((reg)&0xf) << 4) | (((reg)&0x10) >> 2) | 0x8)
-
-#define CS4236_LEFT_LINE       0x08    /* left LINE alternate volume */
-#define CS4236_RIGHT_LINE      0x18    /* right LINE alternate volume */
-#define CS4236_LEFT_MIC                0x28    /* left MIC volume */
-#define CS4236_RIGHT_MIC       0x38    /* right MIC volume */
-#define CS4236_LEFT_MIX_CTRL   0x48    /* synthesis and left input mixer control */
-#define CS4236_RIGHT_MIX_CTRL  0x58    /* right input mixer control */
-#define CS4236_LEFT_FM         0x68    /* left FM volume */
-#define CS4236_RIGHT_FM                0x78    /* right FM volume */
-#define CS4236_LEFT_DSP                0x88    /* left DSP serial port volume */
-#define CS4236_RIGHT_DSP       0x98    /* right DSP serial port volume */
-#define CS4236_RIGHT_LOOPBACK  0xa8    /* right loopback monitor volume */
-#define CS4236_DAC_MUTE                0xb8    /* DAC mute and IFSE enable */
-#define CS4236_ADC_RATE                0xc8    /* indenpendent ADC sample frequency */
-#define CS4236_DAC_RATE                0xd8    /* indenpendent DAC sample frequency */
-#define CS4236_LEFT_MASTER     0xe8    /* left master digital audio volume */
-#define CS4236_RIGHT_MASTER    0xf8    /* right master digital audio volume */
-#define CS4236_LEFT_WAVE       0x0c    /* left wavetable serial port volume */
-#define CS4236_RIGHT_WAVE      0x1c    /* right wavetable serial port volume */
-#define CS4236_VERSION         0x9c    /* chip version and ID */
+#include "cs4231-regs.h"
 
 /* defines for codec.mode */
 
 #define CS4231_HW_CS4239       0x0404  /* CS4239 - Crystal Clear (tm) stereo enhancement */
 /* compatible, but clones */
 #define CS4231_HW_INTERWAVE     0x1000 /* InterWave chip */
-#define CS4231_HW_OPL3SA2       0x1001 /* OPL3-SA2 chip */
+#define CS4231_HW_OPL3SA2       0x1101 /* OPL3-SA2 chip, similar to cs4231 */
 
 /* defines for codec.hwshare */
 #define CS4231_HWSHARE_IRQ     (1<<0)
index 353910ce97556507ce6208c19cb1870f827d5769..6b40ee60f4c56d0d3c37db84a15b167eb3881771 100644 (file)
@@ -2,7 +2,7 @@
 #define __SOUND_CS46XX_H
 
 /*
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>,
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>,
  *                  Cirrus Logic, Inc.
  *  Definitions for Cirrus Logic CS46xx chips
  *
index 9cb6c7d095676171206009afb7ef1df8eee2061b..080857ad0ca276a1df6b5c90c98517b66abce589 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  The driver for the Cirrus Logic's Sound Fusion CS46XX based soundcards
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
index d9da9e59cf37e7bb0f73602c1231ecc2a4c58432..7c44667e79a6498bb1137d4dcc3e11a3a78a342c 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  The driver for the Cirrus Logic's Sound Fusion CS46XX based soundcards
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
index b3076c487de6cd329884dbcc5d4bd3bba922fc39..5cf920bfda2728a27509e14406c93b801f7382e1 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  The driver for the Cirrus Logic's Sound Fusion CS46XX based soundcards
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
index c6c3f9f0da78a2d68e57ec1b079f62b2cd7ec88f..3a8c174a42098a7d2937c0ef0d6dcf9f3436b2d9 100644 (file)
@@ -3,7 +3,7 @@
 
 /*
  *  Routines for Cirrus Logic CS8403/CS8404A IEC958 (S/PDIF) Transmitter
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>,
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>,
  *                  Takashi Iwai <tiwai@suse.de>
  *
  *
index 97fd9acf80288a35e696bdb07df9fb492ef855f8..f862cfff5f6a618daa1057836d30c9a73e0b5653 100644 (file)
@@ -3,7 +3,7 @@
 
 /*
  *  Routines for Cirrus Logic CS8427
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>,
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>,
  *
  *
  *   This program is free software; you can redistribute it and/or modify
index 3c522e59a33cf041f75d3fbf82e1ca7ccd6f31af..5ccb6c5feecbe5e77d23643e484d50f4c8fc19ee 100644 (file)
@@ -3,7 +3,7 @@
 
 /*
  *  Main header file for the ALSA driver
- *  Copyright (c) 1994-2000 by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) 1994-2000 by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
index 529d0a56436782fdf6ec61f00bd0e55784beb2cc..441aa06dcd6f622ceb7774ef9a54b090ebef2edc 100644 (file)
@@ -2,7 +2,7 @@
 #define __SOUND_EMU10K1_H
 
 /*
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>,
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>,
  *                  Creative Labs, Inc.
  *  Definitions for EMU10K1 (SB Live!) chips
  *
@@ -1408,8 +1408,6 @@ struct snd_emu10k1_fx8010 {
        struct snd_emu10k1_fx8010_irq *irq_handlers;
 };
 
-#define emu10k1_gpr_ctl(n) list_entry(n, struct snd_emu10k1_fx8010_ctl, list)
-
 struct snd_emu10k1_midi {
        struct snd_emu10k1 *emu;
        struct snd_rawmidi *rmidi;
@@ -1456,6 +1454,9 @@ struct snd_emu1010 {
        unsigned int adc_pads; /* bit mask */
        unsigned int dac_pads; /* bit mask */
        unsigned int internal_clock; /* 44100 or 48000 */
+       unsigned int optical_in; /* 0:SPDIF, 1:ADAT */
+       unsigned int optical_out; /* 0:SPDIF, 1:ADAT */
+       struct task_struct *firmware_thread;
 };
 
 struct snd_emu10k1 {
@@ -1599,9 +1600,9 @@ unsigned int snd_emu10k1_ptr20_read(struct snd_emu10k1 * emu, unsigned int reg,
 void snd_emu10k1_ptr20_write(struct snd_emu10k1 *emu, unsigned int reg, unsigned int chn, unsigned int data);
 int snd_emu10k1_spi_write(struct snd_emu10k1 * emu, unsigned int data);
 int snd_emu10k1_i2c_write(struct snd_emu10k1 *emu, u32 reg, u32 value);
-int snd_emu1010_fpga_write(struct snd_emu10k1 * emu, int reg, int value);
-int snd_emu1010_fpga_read(struct snd_emu10k1 * emu, int reg, int *value);
-int snd_emu1010_fpga_link_dst_src_write(struct snd_emu10k1 * emu, int dst, int src);
+int snd_emu1010_fpga_write(struct snd_emu10k1 * emu, u32 reg, u32 value);
+int snd_emu1010_fpga_read(struct snd_emu10k1 * emu, u32 reg, u32 *value);
+int snd_emu1010_fpga_link_dst_src_write(struct snd_emu10k1 * emu, u32 dst, u32 src);
 unsigned int snd_emu10k1_efx_read(struct snd_emu10k1 *emu, unsigned int pc);
 void snd_emu10k1_intr_enable(struct snd_emu10k1 *emu, unsigned int intrenb);
 void snd_emu10k1_intr_disable(struct snd_emu10k1 *emu, unsigned int intrenb);
@@ -1746,6 +1747,8 @@ int snd_emu10k1_fx8010_unregister_irq_handler(struct snd_emu10k1 *emu,
 #define A_FXBUS2(x)    (0x80 + (x))    /* x = 0x00 - 0x1f extra outs used for EFX capture -> A_FXWC2 */
 #define A_EMU32OUTH(x) (0xa0 + (x))    /* x = 0x00 - 0x0f "EMU32_OUT_10 - _1F" - ??? */
 #define A_EMU32OUTL(x) (0xb0 + (x))    /* x = 0x00 - 0x0f "EMU32_OUT_1 - _F" - ??? */
+#define A3_EMU32IN(x)  (0x160 + (x))   /* x = 0x00 - 0x3f "EMU32_IN_00 - _3F" - Only when .device = 0x0008 */
+#define A3_EMU32OUT(x) (0x1E0 + (x))   /* x = 0x00 - 0x0f "EMU32_OUT_00 - _3F" - Only when .device = 0x0008 */
 #define A_GPR(x)       (A_FXGPREGBASE + (x))
 
 /* cc_reg constants */
index fc1c47dae3daa8abfa97e778799d28be39ddb97a..10fcf146581041046a4e9da4b839498b7269b0d7 100644 (file)
@@ -3,7 +3,7 @@
 
 /*
  *  Header file for ES488/ES1688
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
index c49ea57db8cc38a6fb4e071e310cf53204a21495..e5433d8b78bc5b692e40a08aa71bb81771739477 100644 (file)
@@ -3,7 +3,7 @@
 
 /*
  *  Global structures used for GUS part of ALSA driver
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
diff --git a/include/sound/hda_hwdep.h b/include/sound/hda_hwdep.h
new file mode 100644 (file)
index 0000000..1c0034e
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * HWDEP Interface for HD-audio codec
+ *
+ * Copyright (c) 2007 Takashi Iwai <tiwai@suse.de>
+ *
+ *  This driver is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This driver is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+ */
+
+#ifndef __SOUND_HDA_HWDEP_H
+#define __SOUND_HDA_HWDEP_H
+
+#define HDA_HWDEP_VERSION      ((1 << 16) | (0 << 8) | (0 << 0)) /* 1.0.0 */
+
+/* verb */
+#define HDA_REG_NID_SHIFT      24
+#define HDA_REG_VERB_SHIFT     8
+#define HDA_REG_VAL_SHIFT      0
+#define HDA_VERB(nid,verb,param)       ((nid)<<24 | (verb)<<8 | (param))
+
+struct hda_verb_ioctl {
+       u32 verb;       /* HDA_VERB() */
+       u32 res;        /* response */
+};
+
+/*
+ * ioctls
+ */
+#define HDA_IOCTL_PVERSION             _IOR('H', 0x10, int)
+#define HDA_IOCTL_VERB_WRITE           _IOWR('H', 0x11, struct hda_verb_ioctl)
+#define HDA_IOCTL_GET_WCAP             _IOWR('H', 0x12, struct hda_verb_ioctl)
+
+#endif
index c3c854d99c28820ffc67e0756ec82ccba73d5d7b..81990b2bcc981bb4f31cae44616aa052c5f1066e 100644 (file)
@@ -1,4 +1,4 @@
-#ifndef __SOUND_HDSPM_H                /* -*- linux-c -*- */
+#ifndef __SOUND_HDSPM_H
 #define __SOUND_HDSPM_H
 /*
  *   Copyright (C) 2003 Winfried Ritsch (IEM)
@@ -61,7 +61,8 @@ struct hdspm_peak_rms_ioctl {
 };
 
 /* use indirect access due to the limit of ioctl bit size */
-#define SNDRV_HDSPM_IOCTL_GET_PEAK_RMS _IOR('H', 0x40, struct hdspm_peak_rms_ioctl)
+#define SNDRV_HDSPM_IOCTL_GET_PEAK_RMS \
+       _IOR('H', 0x40, struct hdspm_peak_rms_ioctl)
 
 /* ------------ CONFIG block IOCTL ---------------------- */
 
@@ -79,7 +80,8 @@ struct hdspm_config_info {
        unsigned int analog_out;
 };
 
-#define SNDRV_HDSPM_IOCTL_GET_CONFIG_INFO _IOR('H', 0x41, struct hdspm_config_info)
+#define SNDRV_HDSPM_IOCTL_GET_CONFIG_INFO \
+       _IOR('H', 0x41, struct hdspm_config_info)
 
 
 /* get Soundcard Version */
@@ -93,10 +95,14 @@ struct hdspm_version {
 
 /* ------------- get Matrix Mixer IOCTL --------------- */
 
-/* MADI mixer: 64inputs+64playback in 64outputs = 8192 => *4Byte = 32768 Bytes */
+/* MADI mixer: 64inputs+64playback in 64outputs = 8192 => *4Byte =
+ * 32768 Bytes
+ */
 
 /* organisation is 64 channelfader in a continous memory block */
-/* equivalent to hardware definition, maybe for future feature of mmap of them */
+/* equivalent to hardware definition, maybe for future feature of mmap of
+ * them
+ */
 /* each of 64 outputs has 64 infader and 64 outfader: 
    Ins to Outs mixer[out].in[in], Outstreams to Outs mixer[out].pb[pb] */
 
index 94c387b5d72429a7d5086849c558ec5df5f8566e..d9eea013c753209a4dcb90f9bfc69eb95b697559 100644 (file)
@@ -3,7 +3,7 @@
 
 /*
  *  Hardware dependent layer 
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
index 97ffc4fb99697fb52964a3bf235b70194ec24546..fecbb1ffd5405ed628cd8f3aafce40318cf7b4fe 100644 (file)
@@ -3,7 +3,7 @@
 
 /*
  *  Header file for info interface
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
index e85b90750a597514b0195c7efc781f3f0de8dc01..1daa6dff82974e8db05bdb6b0c43ce9075cc4d6e 100644 (file)
@@ -3,7 +3,7 @@
 
 /*
  *  Init values for soundcard modules
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *
  *   This program is free software; you can redistribute it and/or modify
  *   it under the terms of the GNU General Public License as published by
index 83489c3abbaf5f048293c4aea3041da63143a879..ae2921d9ddcc24f6712b1653598502235a38c757 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *                   Takashi Iwai <tiwai@suse.de>
  * 
  *  Generic memory allocators
index 197b9e3d612b96d54bcb6912d2dd3d9dffdb302d..51fbcb4a277a611fc836d96bb3a714f5fc60b01f 100644 (file)
@@ -3,7 +3,7 @@
 
 /*
  *  OSS MIXER API
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
index d5c1396c4c9ea974286074d273ae485ffb263ff2..d45218b44dfe590364acc94af00c039c32e15e30 100644 (file)
@@ -3,7 +3,7 @@
 
 /*
  *  Header file for MPU-401 and compatible cards
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
@@ -50,7 +50,6 @@
 #define MPU401_INFO_INTEGRATED (1 << 2)        /* integrated h/w port */
 #define MPU401_INFO_MMIO       (1 << 3)        /* MMIO access */
 #define MPU401_INFO_TX_IRQ     (1 << 4)        /* independent TX irq */
-#define MPU401_INFO_UART_ONLY  (1 << 5)        /* No ENTER_UART cmd needed */
 
 #define MPU401_MODE_BIT_INPUT          0
 #define MPU401_MODE_BIT_OUTPUT         1
index 82fdb09307203d318bf50b66548480cfacf0b538..1d14b3f8239353aa14168dc27721a8a621fe99c6 100644 (file)
@@ -4,7 +4,7 @@
 /*
  * Definitions of the OPL-3 registers.
  *
- * Copyright (c) by Jaroslav Kysela <perex@suse.cz>,
+ * Copyright (c) by Jaroslav Kysela <perex@perex.cz>,
  *                  Hannu Savolainen 1993-1996
  *
  *
index 7003d7702e26796116393e6835576329791283fa..1df7acaaa53527b10a79f390ab07573f17474881 100644 (file)
@@ -2,7 +2,7 @@
  * Helper functions for indirect PCM data transfer
  *
  *  Copyright (c) by Takashi Iwai <tiwai@suse.de>
- *                   Jaroslav Kysela <perex@suse.cz>
+ *                   Jaroslav Kysela <perex@perex.cz>
  *
  *   This program is free software; you can redistribute it and/or modify
  *   it under the terms of the GNU General Public License as published by
index 73334e0f823f57d88ae4bbb5eade93b2b008acfa..5e9cc460075efa5ee9726d0cb282218f67355100 100644 (file)
@@ -3,7 +3,7 @@
 
 /*
  *  Digital Audio (PCM) abstract layer
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *                   Abramo Bagnara <abramo@alsa-project.org>
  *
  *
@@ -301,8 +301,8 @@ struct snd_pcm_runtime {
        union snd_pcm_sync_id sync;     /* hardware synchronization ID */
 
        /* -- mmap -- */
-       volatile struct snd_pcm_mmap_status *status;
-       volatile struct snd_pcm_mmap_control *control;
+       struct snd_pcm_mmap_status *status;
+       struct snd_pcm_mmap_control *control;
 
        /* -- locking / scheduling -- */
        wait_queue_head_t sleep;
@@ -791,13 +791,13 @@ static inline struct snd_interval *hw_param_interval(struct snd_pcm_hw_params *p
 static inline const struct snd_mask *hw_param_mask_c(const struct snd_pcm_hw_params *params,
                                             snd_pcm_hw_param_t var)
 {
-       return (const struct snd_mask *)hw_param_mask((struct snd_pcm_hw_params*) params, var);
+       return &params->masks[var - SNDRV_PCM_HW_PARAM_FIRST_MASK];
 }
 
 static inline const struct snd_interval *hw_param_interval_c(const struct snd_pcm_hw_params *params,
                                                     snd_pcm_hw_param_t var)
 {
-       return (const struct snd_interval *)hw_param_interval((struct snd_pcm_hw_params*) params, var);
+       return &params->intervals[var - SNDRV_PCM_HW_PARAM_FIRST_INTERVAL];
 }
 
 #define params_access(p) snd_mask_min(hw_param_mask((p), SNDRV_PCM_HW_PARAM_ACCESS))
@@ -922,7 +922,10 @@ snd_pcm_sframes_t snd_pcm_lib_writev(struct snd_pcm_substream *substream,
 snd_pcm_sframes_t snd_pcm_lib_readv(struct snd_pcm_substream *substream,
                                    void __user **bufs, snd_pcm_uframes_t frames);
 
+extern const struct snd_pcm_hw_constraint_list snd_pcm_known_rates;
+
 int snd_pcm_limit_hw_rates(struct snd_pcm_runtime *runtime);
+unsigned int snd_pcm_rate_to_rate_bit(unsigned int rate);
 
 static inline void snd_pcm_set_runtime_buffer(struct snd_pcm_substream *substream,
                                              struct snd_dma_buffer *bufp)
index 1cd4f64cdf31529d60dbb91d7fa74bad6420d4f0..cc4e226f35fd5b07a4c0aebbea8ea282aa1309b7 100644 (file)
@@ -3,7 +3,7 @@
 
 /*
  *  Digital Audio (PCM) - OSS compatibility abstract layer
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
index 7dbcd10fa215d00f4f53ea37e8838046fc4b0831..b550a416d075b9d0cefbdd684c24d953a46fd936 100644 (file)
@@ -3,7 +3,7 @@
 
 /*
  *  Abstract layer for MIDI v1.0 stream
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
index 3ad854b397d27234378276982d764ab649d55c27..d0c9ed3546c89d8d12687b413d2744daaad19334 100644 (file)
@@ -3,7 +3,7 @@
 
 /*
  *  Header file for SoundBlaster cards
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
index f2db03bfd74e59c1329d1c6691438177439f8f9f..93b0c51df5b0fa19a9797b17f70feb2ae5995ccc 100644 (file)
@@ -3,7 +3,7 @@
 
 /*
  *  Main kernel header file for the ALSA sequencer
- *  Copyright (c) 1999 by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) 1999 by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
index dd789e7cdb2018c53ae3e95fd3a1af01225b50fd..5efab8b29c57382e59047daad6cf6d14c7e3495e 100644 (file)
@@ -5,7 +5,7 @@
  *  MIDI byte <-> sequencer event coder
  *
  *  Copyright (C) 1998,99 Takashi Iwai <tiwai@suse.de>,
- *                        Jaroslav Kysela <perex@suse.cz>
+ *                        Jaroslav Kysela <perex@perex.cz>
  *
  *   This program is free software; you can redistribute it and/or modify
  *   it under the terms of the GNU General Public License as published by
index 8d5aea76d7c378addd6c7835e2488cacd957342c..d888433a309658ab9b306395d4663ddbb57fd899 100644 (file)
@@ -4,7 +4,7 @@
 /*
  *  Virtual Raw MIDI client on Sequencer
  *  Copyright (c) 2000 by Takashi Iwai <tiwai@suse.de>,
- *                        Jaroslav Kysela <perex@suse.cz>
+ *                        Jaroslav Kysela <perex@perex.cz>
  *
  *   This program is free software; you can redistribute it and/or modify
  *   it under the terms of the GNU General Public License as published by
index db6edba8ef08c1de709bfbb60e591a7e80c7353b..f47ef1f75f18107a92e86e69f864ea1e6b0aec47 100644 (file)
@@ -201,8 +201,7 @@ int snd_soc_info_volsw(struct snd_kcontrol *kcontrol,
        struct snd_ctl_elem_info *uinfo);
 int snd_soc_info_volsw_ext(struct snd_kcontrol *kcontrol,
        struct snd_ctl_elem_info *uinfo);
-int snd_soc_info_bool_ext(struct snd_kcontrol *kcontrol,
-       struct snd_ctl_elem_info *uinfo);
+#define snd_soc_info_bool_ext          snd_ctl_boolean_mono
 int snd_soc_get_volsw(struct snd_kcontrol *kcontrol,
        struct snd_ctl_elem_value *ucontrol);
 int snd_soc_put_volsw(struct snd_kcontrol *kcontrol,
index b5067d3c2387c469d7b86672b51d018948d1d7f8..e8eeb3a1ed291fd0aae971cf45d1ced075785bce 100644 (file)
@@ -4,7 +4,7 @@
 /*
  *   ALSA driver for TEA5757/5759 Philips AM/FM tuner chips
  *
- *     Copyright (c) 2004 Jaroslav Kysela <perex@suse.cz>
+ *     Copyright (c) 2004 Jaroslav Kysela <perex@perex.cz>
  *
  *   This program is free software; you can redistribute it and/or modify
  *   it under the terms of the GNU General Public License as published by
index d42c083db1dac0d9dbdfa599b2228675123a5526..7990469a44ce3df7909bdd447cd743019f900f37 100644 (file)
@@ -3,7 +3,7 @@
 
 /*
  *  Timer abstract layer
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>,
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>,
  *                  Abramo Bagnara <abramo@alsa-project.org>
  *
  *
index d93a96b91875a8a42f8e6a484c313c468b0b20c4..d136ea2181ed4f2fc0b92dd25b7cd0ac8e6c2860 100644 (file)
@@ -3,7 +3,7 @@
 
 /*
  *  Advanced Linux Sound Architecture - ALSA - Driver
- *  Copyright (c) 2006 by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) 2006 by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
index 6bbcfefd2c385f0193e49c683a0f14393737fb06..8d4a8dd892373e63d1ce518c2bdb61ecf0192514 100644 (file)
@@ -1,3 +1,3 @@
 /* include/version.h.  Generated by alsa/ksync script.  */
-#define CONFIG_SND_VERSION "1.0.14"
-#define CONFIG_SND_DATE " (Fri Jul 20 09:12:58 2007 UTC)"
+#define CONFIG_SND_VERSION "1.0.15"
+#define CONFIG_SND_DATE " (Tue Oct 16 14:57:44 2007 UTC)"
index 203d2b45b7889d2b55811150a09dd39250a2ffee..05ead66984347be76872c0bf0e5da507cc53b760 100644 (file)
@@ -2,7 +2,7 @@
 #define __SOUND_YMFPCI_H
 
 /*
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *  Definitions for Yahama YMF724/740/744/754 chips
  *
  *
index e48b9b37d228ddec3c0b4172ec493d70ee2f4db4..b2a2db47aff54820e02a635655f4c06ce8a92b1a 100644 (file)
@@ -63,6 +63,10 @@ source "sound/aoa/Kconfig"
 
 source "sound/arm/Kconfig"
 
+if SPI
+source "sound/spi/Kconfig"
+endif
+
 source "sound/mips/Kconfig"
 
 source "sound/sh/Kconfig"
index 3ead922bd9c6f50b39e650c3e4172fe31798bf80..c76d70716fa537edccbe4ceada9b3eea1fbfa9f4 100644 (file)
@@ -5,7 +5,8 @@ obj-$(CONFIG_SOUND) += soundcore.o
 obj-$(CONFIG_SOUND_PRIME) += sound_firmware.o
 obj-$(CONFIG_SOUND_PRIME) += oss/
 obj-$(CONFIG_DMASOUND) += oss/
-obj-$(CONFIG_SND) += core/ i2c/ drivers/ isa/ pci/ ppc/ arm/ sh/ synth/ usb/ sparc/ parisc/ pcmcia/ mips/ soc/
+obj-$(CONFIG_SND) += core/ i2c/ drivers/ isa/ pci/ ppc/ arm/ sh/ synth/ usb/ \
+       sparc/ spi/ parisc/ pcmcia/ mips/ soc/
 obj-$(CONFIG_SND_AOA) += aoa/
 
 # This one must be compilable even if sound is configured out
index 028852374f215de4c14e46f52ffaf4541e0db3d2..71e3f93606580510dc5caf7c374f75ee45f1b460 100644 (file)
@@ -297,15 +297,7 @@ static struct snd_kcontrol_new capture_source_control = {
        .put = onyx_snd_capture_source_put,
 };
 
-static int onyx_snd_mute_info(struct snd_kcontrol *kcontrol,
-       struct snd_ctl_elem_info *uinfo)
-{
-       uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
-       uinfo->count = 2;
-       uinfo->value.integer.min = 0;
-       uinfo->value.integer.max = 1;
-       return 0;
-}
+#define onyx_snd_mute_info     snd_ctl_boolean_stereo_info
 
 static int onyx_snd_mute_get(struct snd_kcontrol *kcontrol,
        struct snd_ctl_elem_value *ucontrol)
@@ -359,15 +351,7 @@ static struct snd_kcontrol_new mute_control = {
 };
 
 
-static int onyx_snd_single_bit_info(struct snd_kcontrol *kcontrol,
-       struct snd_ctl_elem_info *uinfo)
-{
-       uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
-       uinfo->count = 1;
-       uinfo->value.integer.min = 0;
-       uinfo->value.integer.max = 1;
-       return 0;
-}
+#define onyx_snd_single_bit_info       snd_ctl_boolean_mono_info
 
 #define FLAG_POLARITY_INVERT   1
 #define FLAG_SPDIFLOCK         2
index 2f771f57c76fbf4207c173b4146bb575fa292cab..70c341684794cb987189827ff0727c7b2273d5b5 100644 (file)
@@ -272,15 +272,7 @@ static struct snd_kcontrol_new volume_control = {
        .put = tas_snd_vol_put,
 };
 
-static int tas_snd_mute_info(struct snd_kcontrol *kcontrol,
-       struct snd_ctl_elem_info *uinfo)
-{
-       uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
-       uinfo->count = 2;
-       uinfo->value.integer.min = 0;
-       uinfo->value.integer.max = 1;
-       return 0;
-}
+#define tas_snd_mute_info      snd_ctl_boolean_stereo_info
 
 static int tas_snd_mute_get(struct snd_kcontrol *kcontrol,
        struct snd_ctl_elem_value *ucontrol)
@@ -431,15 +423,7 @@ static struct snd_kcontrol_new drc_range_control = {
        .put = tas_snd_drc_range_put,
 };
 
-static int tas_snd_drc_switch_info(struct snd_kcontrol *kcontrol,
-       struct snd_ctl_elem_info *uinfo)
-{
-       uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
-       uinfo->count = 1;
-       uinfo->value.integer.min = 0;
-       uinfo->value.integer.max = 1;
-       return 0;
-}
+#define tas_snd_drc_switch_info                snd_ctl_boolean_mono_info
 
 static int tas_snd_drc_switch_get(struct snd_kcontrol *kcontrol,
        struct snd_ctl_elem_value *ucontrol)
@@ -743,6 +727,7 @@ static int tas_switch_clock(struct codec_info_item *cii, enum clock_switch clock
        return 0;
 }
 
+#ifdef CONFIG_PM
 /* we are controlled via i2c and assume that is always up
  * If that wasn't the case, we'd have to suspend once
  * our i2c device is suspended, and then take note of that! */
@@ -768,7 +753,6 @@ static int tas_resume(struct tas *tas)
        return 0;
 }
 
-#ifdef CONFIG_PM
 static int _tas_suspend(struct codec_info_item *cii, pm_message_t state)
 {
        return tas_suspend(cii->codec_data);
@@ -778,7 +762,10 @@ static int _tas_resume(struct codec_info_item *cii)
 {
        return tas_resume(cii->codec_data);
 }
-#endif
+#else /* CONFIG_PM */
+#define _tas_suspend   NULL
+#define _tas_resume    NULL
+#endif /* CONFIG_PM */
 
 static struct codec_info tas_codec_info = {
        .transfers = tas_transfers,
@@ -791,10 +778,8 @@ static struct codec_info tas_codec_info = {
        .owner = THIS_MODULE,
        .usable = tas_usable,
        .switch_clock = tas_switch_clock,
-#ifdef CONFIG_PM
        .suspend = _tas_suspend,
        .resume = _tas_resume,
-#endif
 };
 
 static int tas_init_codec(struct aoa_codec *codec)
index 98806283d1b2d3682353d915bcb0ddd2ff32aec4..8b2ba99d7f8a2640018266ba2659dc122463914a 100644 (file)
@@ -582,15 +582,7 @@ static int layouts_list_items;
  * make the fabric handle all the card stuff, etc... */
 static struct layout_dev *layout_device;
 
-static int control_info(struct snd_kcontrol *kcontrol,
-                       struct snd_ctl_elem_info *uinfo)
-{
-       uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
-       uinfo->count = 1;
-       uinfo->value.integer.min = 0;
-       uinfo->value.integer.max = 1;
-       return 0;
-}
+#define control_info   snd_ctl_boolean_mono_info
 
 #define AMP_CONTROL(n, description)                                    \
 static int n##_control_get(struct snd_kcontrol *kcontrol,              \
index e7ed868fa7c0d4f50d5d1c7d87c117b4efc76569..81c64b09d3592168ac544e14ba1478bcc907e463 100644 (file)
 #include <asm/mach-types.h>
 #include <asm/dma.h>
 
-#ifdef CONFIG_H3600_HAL
-#include <asm/semaphore.h>
-#include <asm/uaccess.h>
-#include <asm/arch/h3600_hal.h>
-#endif
-
 #include <sound/core.h>
 #include <sound/pcm.h>
 #include <sound/initval.h>
  * We use DMA stuff from 2.4.18-rmk3-hh24 here to be able to compile this
  * module for Familiar 0.6.1
  */
-#ifdef CONFIG_H3600_HAL
-#define HH_VERSION 1
-#endif
 
 /* {{{ Type definitions */
 
@@ -238,11 +229,8 @@ static void sa11xx_uda1341_set_samplerate(struct sa11xx_uda1341 *sa11xx_uda1341,
                rate = 8000;
 
        /* Set the external clock generator */
-#ifdef CONFIG_H3600_HAL
-       h3600_audio_clock(rate);
-#else  
+       
        sa11xx_uda1341_set_audio_clock(rate);
-#endif
 
        /* Select the clock divisor */
        switch (rate) {
@@ -307,13 +295,10 @@ static void sa11xx_uda1341_audio_init(struct sa11xx_uda1341 *sa11xx_uda1341)
        local_irq_restore(flags);
 
        /* Enable the audio power */
-#ifdef CONFIG_H3600_HAL
-       h3600_audio_power(AUDIO_RATE_DEFAULT);
-#else
+
        clr_sa11xx_uda1341_egpio(IPAQ_EGPIO_CODEC_NRESET);
        set_sa11xx_uda1341_egpio(IPAQ_EGPIO_AUDIO_ON);
        set_sa11xx_uda1341_egpio(IPAQ_EGPIO_QMUTE);
-#endif
  
        /* Wait for the UDA1341 to wake up */
        mdelay(1); //FIXME - was removed by Perex - Why?
@@ -331,21 +316,13 @@ static void sa11xx_uda1341_audio_init(struct sa11xx_uda1341 *sa11xx_uda1341)
        /* make the left and right channels unswapped (flip the WS latch) */
        Ser4SSDR = 0;
 
-#ifdef CONFIG_H3600_HAL
-       h3600_audio_mute(0);
-#else  
-       clr_sa11xx_uda1341_egpio(IPAQ_EGPIO_QMUTE);        
-#endif     
+       clr_sa11xx_uda1341_egpio(IPAQ_EGPIO_QMUTE);
 }
 
 static void sa11xx_uda1341_audio_shutdown(struct sa11xx_uda1341 *sa11xx_uda1341)
 {
        /* mute on */
-#ifdef CONFIG_H3600_HAL
-       h3600_audio_mute(1);
-#else  
        set_sa11xx_uda1341_egpio(IPAQ_EGPIO_QMUTE);
-#endif
        
        /* disable the audio power and all signals leading to the audio chip */
        l3_close(sa11xx_uda1341->uda1341);
@@ -354,13 +331,9 @@ static void sa11xx_uda1341_audio_shutdown(struct sa11xx_uda1341 *sa11xx_uda1341)
 
        /* power off and mute off */
        /* FIXME - is muting off necesary??? */
-#ifdef CONFIG_H3600_HAL
-       h3600_audio_power(0);
-       h3600_audio_mute(0);
-#else  
+
        clr_sa11xx_uda1341_egpio(IPAQ_EGPIO_AUDIO_ON);
        clr_sa11xx_uda1341_egpio(IPAQ_EGPIO_QMUTE);
-#endif 
 }
 
 /* }}} */
index 5a01c76d02e8f0c90b7196c2588e2695a43e6bc8..267039a97bd51e1beca02ba63de7cb70305e87f3 100644 (file)
@@ -1,20 +1,17 @@
 #
 # Makefile for ALSA
-# Copyright (c) 1999,2001 by Jaroslav Kysela <perex@suse.cz>
+# Copyright (c) 1999,2001 by Jaroslav Kysela <perex@perex.cz>
 #
 
-snd-objs     := sound.o init.o memory.o info.o control.o misc.o device.o
-ifeq ($(CONFIG_ISA_DMA_API),y)
-snd-objs     += isadma.o
-endif
-ifeq ($(CONFIG_SND_OSSEMUL),y)
-snd-objs     += sound_oss.o info_oss.o
-endif
+snd-y     := sound.o init.o memory.o info.o control.o misc.o device.o
+snd-$(CONFIG_ISA_DMA_API) += isadma.o
+snd-$(CONFIG_SND_OSSEMUL) += sound_oss.o info_oss.o
 
 snd-pcm-objs := pcm.o pcm_native.o pcm_lib.o pcm_timer.o pcm_misc.o \
                pcm_memory.o
 
-snd-page-alloc-objs := memalloc.o sgbuf.o
+snd-page-alloc-y := memalloc.o
+snd-page-alloc-$(CONFIG_HAS_DMA) += sgbuf.o
 
 snd-rawmidi-objs  := rawmidi.o
 snd-timer-objs    := timer.o
index 1f1ab9c1b668c5704badb84379f809439b085c09..4c3aa8e10378bd306763dba42f16b6b9a564ebd5 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Routines for driver control interface
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
@@ -716,8 +716,6 @@ int snd_ctl_elem_read(struct snd_card *card, struct snd_ctl_elem_value *control)
        return result;
 }
 
-EXPORT_SYMBOL(snd_ctl_elem_read);
-
 static int snd_ctl_elem_read_user(struct snd_card *card,
                                  struct snd_ctl_elem_value __user *_control)
 {
@@ -781,8 +779,6 @@ int snd_ctl_elem_write(struct snd_card *card, struct snd_ctl_file *file,
        return result;
 }
 
-EXPORT_SYMBOL(snd_ctl_elem_write);
-
 static int snd_ctl_elem_write_user(struct snd_ctl_file *file,
                                   struct snd_ctl_elem_value __user *_control)
 {
@@ -1486,3 +1482,30 @@ int snd_ctl_create(struct snd_card *card)
        snd_assert(card != NULL, return -ENXIO);
        return snd_device_new(card, SNDRV_DEV_CONTROL, card, &ops);
 }
+
+/*
+ * Frequently used control callbacks
+ */
+int snd_ctl_boolean_mono_info(struct snd_kcontrol *kcontrol,
+                             struct snd_ctl_elem_info *uinfo)
+{
+       uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
+       uinfo->count = 1;
+       uinfo->value.integer.min = 0;
+       uinfo->value.integer.max = 1;
+       return 0;
+}
+
+EXPORT_SYMBOL(snd_ctl_boolean_mono_info);
+
+int snd_ctl_boolean_stereo_info(struct snd_kcontrol *kcontrol,
+                               struct snd_ctl_elem_info *uinfo)
+{
+       uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
+       uinfo->count = 2;
+       uinfo->value.integer.min = 0;
+       uinfo->value.integer.max = 1;
+       return 0;
+}
+
+EXPORT_SYMBOL(snd_ctl_boolean_stereo_info);
index 5858b02b0b1d4e753e4a1d9ee2bceedfaec02019..ea1a0621eefb6680ccd885b014005281ad455820 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Device management routines
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
index 51ad95b7c894e9d6d1b12a3c5b748cd4978347ff..bfd9d182b8a33ac3c85ec3067c51ee4642404d30 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Hardware dependent layer
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
@@ -31,7 +31,7 @@
 #include <sound/hwdep.h>
 #include <sound/info.h>
 
-MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>");
+MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>");
 MODULE_DESCRIPTION("Hardware dependent layer");
 MODULE_LICENSE("GPL");
 
index bf6dbf99528be5a0895de0d3616f02e15d1c350a..1ffd29bb4cd06c25759d7959005d19e1ab1e0427 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Information interface for ALSA driver
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
index a444bfe2cf7417245014562a20b06791006dbaab..435c9399f7a94aa51aad11f2826993e395158639 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Information interface for ALSA driver
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
index f2fe357371860a4bee7b3c98e66f6ad00568f726..2cb7099eb1e1b994fa12f7c24da0189f98c5fa5a 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Initialization routines
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
index d52398727f0abd4cc32b1b16434726644d42a6f8..eb173cef4f05e3925565090e048b8be0d3e161bb 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  ISA DMA support functions
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
index 9b5656d8bccac7d140168bfbd1e65af4a0e96c13..9b4992eab479defd06cb28663ff448beb047be79 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *                   Takashi Iwai <tiwai@suse.de>
  * 
  *  Generic memory allocators
@@ -38,7 +38,7 @@
 #endif
 
 
-MODULE_AUTHOR("Takashi Iwai <tiwai@suse.de>, Jaroslav Kysela <perex@suse.cz>");
+MODULE_AUTHOR("Takashi Iwai <tiwai@suse.de>, Jaroslav Kysela <perex@perex.cz>");
 MODULE_DESCRIPTION("Memory allocator for ALSA system.");
 MODULE_LICENSE("GPL");
 
@@ -206,6 +206,7 @@ void snd_free_pages(void *ptr, size_t size)
  *
  */
 
+#ifdef CONFIG_HAS_DMA
 /* allocate the coherent DMA pages */
 static void *snd_malloc_dev_pages(struct device *dev, size_t size, dma_addr_t *dma)
 {
@@ -239,6 +240,7 @@ static void snd_free_dev_pages(struct device *dev, size_t size, void *ptr,
        dec_snd_pages(pg);
        dma_free_coherent(dev, PAGE_SIZE << pg, ptr, dma);
 }
+#endif /* CONFIG_HAS_DMA */
 
 #ifdef CONFIG_SBUS
 
@@ -312,12 +314,14 @@ int snd_dma_alloc_pages(int type, struct device *device, size_t size,
                dmab->area = snd_malloc_sbus_pages(device, size, &dmab->addr);
                break;
 #endif
+#ifdef CONFIG_HAS_DMA
        case SNDRV_DMA_TYPE_DEV:
                dmab->area = snd_malloc_dev_pages(device, size, &dmab->addr);
                break;
        case SNDRV_DMA_TYPE_DEV_SG:
                snd_malloc_sgbuf_pages(device, size, dmab, NULL);
                break;
+#endif
        default:
                printk(KERN_ERR "snd-malloc: invalid device type %d\n", type);
                dmab->area = NULL;
@@ -383,12 +387,14 @@ void snd_dma_free_pages(struct snd_dma_buffer *dmab)
                snd_free_sbus_pages(dmab->dev.dev, dmab->bytes, dmab->area, dmab->addr);
                break;
 #endif
+#ifdef CONFIG_HAS_DMA
        case SNDRV_DMA_TYPE_DEV:
                snd_free_dev_pages(dmab->dev.dev, dmab->bytes, dmab->area, dmab->addr);
                break;
        case SNDRV_DMA_TYPE_DEV_SG:
                snd_free_sgbuf_pages(dmab);
                break;
+#endif
        default:
                printk(KERN_ERR "snd-malloc: invalid device type %d\n", dmab->dev.type);
        }
index 93537ab7c2acb4c2e0864076ddd250d955ef6252..25b0f056563e79ed8d339202f617a33434b0f6f4 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  * 
  *  Misc memory accessors
  *
index f78cd000e88d6ec0a8d54df79ce393c5e68fb66e..6cabab8cc5374993d0e856d340d8894c4d965596 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Misc and compatibility things
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
index e6d5a045ba2751603f105c1322c937c43f03bf4f..10a79453245f3d00d8485dde469984855010791f 100644 (file)
@@ -1,12 +1,13 @@
 #
 # Makefile for ALSA
-# Copyright (c) 1999 by Jaroslav Kysela <perex@suse.cz>
+# Copyright (c) 1999 by Jaroslav Kysela <perex@perex.cz>
 #
 
 snd-mixer-oss-objs := mixer_oss.o
 
-snd-pcm-oss-objs := pcm_oss.o pcm_plugin.o \
-                   io.o copy.o linear.o mulaw.o route.o rate.o
+snd-pcm-oss-y := pcm_oss.o
+snd-pcm-oss-$(CONFIG_SND_PCM_OSS_PLUGINS) += pcm_plugin.o \
+       io.o copy.o linear.o mulaw.o route.o rate.o
 
 obj-$(CONFIG_SND_MIXER_OSS) += snd-mixer-oss.o
 obj-$(CONFIG_SND_PCM_OSS) += snd-pcm-oss.o
index 6658facc5cdaa2701f85bd9d1bf51edd67a54a87..d6a04c2d5a75a7933fd5d7f9c51008a08536565a 100644 (file)
@@ -20,9 +20,6 @@
  */
 
 #include <sound/driver.h>
-
-#ifdef CONFIG_SND_PCM_OSS_PLUGINS
-
 #include <linux/time.h>
 #include <sound/core.h>
 #include <sound/pcm.h>
@@ -88,5 +85,3 @@ int snd_pcm_plugin_build_copy(struct snd_pcm_substream *plug,
        *r_plugin = plugin;
        return 0;
 }
-
-#endif
index b6e7ce30e5a35dea6927d323d4390eb7e11824ec..3ece39fc48dbaff2a8c06e4ef9cf0f62f73a32a7 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  PCM I/O Plug-In Interface
- *  Copyright (c) 1999 by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) 1999 by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This library is free software; you can redistribute it and/or modify
@@ -20,9 +20,6 @@
  */
   
 #include <sound/driver.h>
-
-#ifdef CONFIG_SND_PCM_OSS_PLUGINS
-
 #include <linux/time.h>
 #include <sound/core.h>
 #include <sound/pcm.h>
@@ -135,5 +132,3 @@ int snd_pcm_plugin_build_io(struct snd_pcm_substream *plug,
        *r_plugin = plugin;
        return 0;
 }
-
-#endif
index 5b1bcdc64779d7c446b89bd70602af52e63300f7..06f96a3e86f675dded23ca2adaa20b59f3b31d52 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Linear conversion Plug-In
- *  Copyright (c) 1999 by Jaroslav Kysela <perex@suse.cz>,
+ *  Copyright (c) 1999 by Jaroslav Kysela <perex@perex.cz>,
  *                       Abramo Bagnara <abramo@alsa-project.org>
  *
  *
@@ -21,9 +21,6 @@
  */
 
 #include <sound/driver.h>
-
-#ifdef CONFIG_SND_PCM_OSS_PLUGINS
-
 #include <linux/time.h>
 #include <sound/core.h>
 #include <sound/pcm.h>
  */
  
 struct linear_priv {
-       int conv;
+       int cvt_endian;         /* need endian conversion? */
+       unsigned int src_ofs;   /* byte offset in source format */
+       unsigned int dst_ofs;   /* byte soffset in destination format */
+       unsigned int copy_ofs;  /* byte offset in temporary u32 data */
+       unsigned int dst_bytes;         /* byte size of destination format */
+       unsigned int copy_bytes;        /* bytes to copy per conversion */
+       unsigned int flip; /* MSB flip for signeness, done after endian conv */
 };
 
+static inline void do_convert(struct linear_priv *data,
+                             unsigned char *dst, unsigned char *src)
+{
+       unsigned int tmp = 0;
+       unsigned char *p = (unsigned char *)&tmp;
+
+       memcpy(p + data->copy_ofs, src + data->src_ofs, data->copy_bytes);
+       if (data->cvt_endian)
+               tmp = swab32(tmp);
+       tmp ^= data->flip;
+       memcpy(dst, p + data->dst_ofs, data->dst_bytes);
+}
+
 static void convert(struct snd_pcm_plugin *plugin,
                    const struct snd_pcm_plugin_channel *src_channels,
                    struct snd_pcm_plugin_channel *dst_channels,
                    snd_pcm_uframes_t frames)
 {
-#define CONV_LABELS
-#include "plugin_ops.h"
-#undef CONV_LABELS
        struct linear_priv *data = (struct linear_priv *)plugin->extra_data;
-       void *conv = conv_labels[data->conv];
        int channel;
        int nchannels = plugin->src_format.channels;
        for (channel = 0; channel < nchannels; ++channel) {
@@ -67,11 +79,7 @@ static void convert(struct snd_pcm_plugin *plugin,
                dst_step = dst_channels[channel].area.step / 8;
                frames1 = frames;
                while (frames1-- > 0) {
-                       goto *conv;
-#define CONV_END after
-#include "plugin_ops.h"
-#undef CONV_END
-               after:
+                       do_convert(data, dst, src);
                        src += src_step;
                        dst += dst_step;
                }
@@ -106,29 +114,36 @@ static snd_pcm_sframes_t linear_transfer(struct snd_pcm_plugin *plugin,
        return frames;
 }
 
-static int conv_index(int src_format, int dst_format)
+static void init_data(struct linear_priv *data, int src_format, int dst_format)
 {
-       int src_endian, dst_endian, sign, src_width, dst_width;
-
-       sign = (snd_pcm_format_signed(src_format) !=
-               snd_pcm_format_signed(dst_format));
-#ifdef SNDRV_LITTLE_ENDIAN
-       src_endian = snd_pcm_format_big_endian(src_format);
-       dst_endian = snd_pcm_format_big_endian(dst_format);
-#else
-       src_endian = snd_pcm_format_little_endian(src_format);
-       dst_endian = snd_pcm_format_little_endian(dst_format);
-#endif
-
-       if (src_endian < 0)
-               src_endian = 0;
-       if (dst_endian < 0)
-               dst_endian = 0;
-
-       src_width = snd_pcm_format_width(src_format) / 8 - 1;
-       dst_width = snd_pcm_format_width(dst_format) / 8 - 1;
-
-       return src_width * 32 + src_endian * 16 + sign * 8 + dst_width * 2 + dst_endian;
+       int src_le, dst_le, src_bytes, dst_bytes;
+
+       src_bytes = snd_pcm_format_width(src_format) / 8;
+       dst_bytes = snd_pcm_format_width(dst_format) / 8;
+       src_le = snd_pcm_format_little_endian(src_format) > 0;
+       dst_le = snd_pcm_format_little_endian(dst_format) > 0;
+
+       data->dst_bytes = dst_bytes;
+       data->cvt_endian = src_le != dst_le;
+       data->copy_bytes = src_bytes < dst_bytes ? src_bytes : dst_bytes;
+       if (src_le) {
+               data->copy_ofs = 4 - data->copy_bytes;
+               data->src_ofs = src_bytes - data->copy_bytes;
+       } else
+               data->src_ofs = snd_pcm_format_physical_width(src_format) / 8 -
+                       src_bytes;
+       if (dst_le)
+               data->dst_ofs = 4 - data->dst_bytes;
+       else
+               data->dst_ofs = snd_pcm_format_physical_width(dst_format) / 8 -
+                       dst_bytes;
+       if (snd_pcm_format_signed(src_format) !=
+           snd_pcm_format_signed(dst_format)) {
+               if (dst_le)
+                       data->flip = cpu_to_le32(0x80000000);
+               else
+                       data->flip = cpu_to_be32(0x80000000);
+       }
 }
 
 int snd_pcm_plugin_build_linear(struct snd_pcm_substream *plug,
@@ -154,10 +169,8 @@ int snd_pcm_plugin_build_linear(struct snd_pcm_substream *plug,
        if (err < 0)
                return err;
        data = (struct linear_priv *)plugin->extra_data;
-       data->conv = conv_index(src_format->format, dst_format->format);
+       init_data(data, src_format->format, dst_format->format);
        plugin->transfer = linear_transfer;
        *r_plugin = plugin;
        return 0;
 }
-
-#endif
index fccad8f0a6bb1de4d9b528a88934d7778e9c1042..3ace4a5680ba532ec394e2dcaef8d8b21eb18c08 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  OSS emulation layer for the mixer interface
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
@@ -33,7 +33,7 @@
 
 #define OSS_ALSAEMULVER         _SIOR ('M', 249, int)
 
-MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>");
+MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>");
 MODULE_DESCRIPTION("Mixer OSS emulation for ALSA.");
 MODULE_LICENSE("GPL");
 MODULE_ALIAS_SNDRV_MINOR(SNDRV_MINOR_OSS_MIXER);
index 2eb18807e6d04662f9d85bed3355d8ad2cd5b5e6..848db82529ed26ca17cc9674e754cc1e27c011c0 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Mu-Law conversion Plug-In Interface
- *  Copyright (c) 1999 by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) 1999 by Jaroslav Kysela <perex@perex.cz>
  *                        Uros Bizjak <uros@kss-loka.si>
  *
  *  Based on reference implementation by Sun Microsystems, Inc.
@@ -22,9 +22,6 @@
  */
   
 #include <sound/driver.h>
-
-#ifdef CONFIG_SND_PCM_OSS_PLUGINS
-
 #include <linux/time.h>
 #include <sound/core.h>
 #include <sound/pcm.h>
@@ -149,19 +146,32 @@ typedef void (*mulaw_f)(struct snd_pcm_plugin *plugin,
 
 struct mulaw_priv {
        mulaw_f func;
-       int conv;
+       int cvt_endian;                 /* need endian conversion? */
+       unsigned int native_ofs;        /* byte offset in native format */
+       unsigned int copy_ofs;          /* byte offset in s16 format */
+       unsigned int native_bytes;      /* byte size of the native format */
+       unsigned int copy_bytes;        /* bytes to copy per conversion */
+       u16 flip; /* MSB flip for signedness, done after endian conversion */
 };
 
+static inline void cvt_s16_to_native(struct mulaw_priv *data,
+                                    unsigned char *dst, u16 sample)
+{
+       sample ^= data->flip;
+       if (data->cvt_endian)
+               sample = swab16(sample);
+       if (data->native_bytes > data->copy_bytes)
+               memset(dst, 0, data->native_bytes);
+       memcpy(dst + data->native_ofs, (char *)&sample + data->copy_ofs,
+              data->copy_bytes);
+}
+
 static void mulaw_decode(struct snd_pcm_plugin *plugin,
                        const struct snd_pcm_plugin_channel *src_channels,
                        struct snd_pcm_plugin_channel *dst_channels,
                        snd_pcm_uframes_t frames)
 {
-#define PUT_S16_LABELS
-#include "plugin_ops.h"
-#undef PUT_S16_LABELS
        struct mulaw_priv *data = (struct mulaw_priv *)plugin->extra_data;
-       void *put = put_s16_labels[data->conv];
        int channel;
        int nchannels = plugin->src_format.channels;
        for (channel = 0; channel < nchannels; ++channel) {
@@ -183,30 +193,33 @@ static void mulaw_decode(struct snd_pcm_plugin *plugin,
                frames1 = frames;
                while (frames1-- > 0) {
                        signed short sample = ulaw2linear(*src);
-                       goto *put;
-#define PUT_S16_END after
-#include "plugin_ops.h"
-#undef PUT_S16_END
-               after:
+                       cvt_s16_to_native(data, dst, sample);
                        src += src_step;
                        dst += dst_step;
                }
        }
 }
 
+static inline signed short cvt_native_to_s16(struct mulaw_priv *data,
+                                            unsigned char *src)
+{
+       u16 sample = 0;
+       memcpy((char *)&sample + data->copy_ofs, src + data->native_ofs,
+              data->copy_bytes);
+       if (data->cvt_endian)
+               sample = swab16(sample);
+       sample ^= data->flip;
+       return (signed short)sample;
+}
+
 static void mulaw_encode(struct snd_pcm_plugin *plugin,
                        const struct snd_pcm_plugin_channel *src_channels,
                        struct snd_pcm_plugin_channel *dst_channels,
                        snd_pcm_uframes_t frames)
 {
-#define GET_S16_LABELS
-#include "plugin_ops.h"
-#undef GET_S16_LABELS
        struct mulaw_priv *data = (struct mulaw_priv *)plugin->extra_data;
-       void *get = get_s16_labels[data->conv];
        int channel;
        int nchannels = plugin->src_format.channels;
-       signed short sample = 0;
        for (channel = 0; channel < nchannels; ++channel) {
                char *src;
                char *dst;
@@ -225,11 +238,7 @@ static void mulaw_encode(struct snd_pcm_plugin *plugin,
                dst_step = dst_channels[channel].area.step / 8;
                frames1 = frames;
                while (frames1-- > 0) {
-                       goto *get;
-#define GET_S16_END after
-#include "plugin_ops.h"
-#undef GET_S16_END
-               after:
+                       signed short sample = cvt_native_to_s16(data, src);
                        *dst = linear2ulaw(sample);
                        src += src_step;
                        dst += dst_step;
@@ -265,23 +274,25 @@ static snd_pcm_sframes_t mulaw_transfer(struct snd_pcm_plugin *plugin,
        return frames;
 }
 
-static int getput_index(int format)
+static void init_data(struct mulaw_priv *data, int format)
 {
-       int sign, width, endian;
-       sign = !snd_pcm_format_signed(format);
-       width = snd_pcm_format_width(format) / 8 - 1;
-       if (width < 0 || width > 3) {
-               snd_printk(KERN_ERR "snd-pcm-oss: invalid format %d\n", format);
-               width = 0;
-       }
 #ifdef SNDRV_LITTLE_ENDIAN
-       endian = snd_pcm_format_big_endian(format);
+       data->cvt_endian = snd_pcm_format_big_endian(format) > 0;
 #else
-       endian = snd_pcm_format_little_endian(format);
+       data->cvt_endian = snd_pcm_format_little_endian(format) > 0;
 #endif
-       if (endian < 0)
-               endian = 0;
-       return width * 4 + endian * 2 + sign;
+       if (!snd_pcm_format_signed(format))
+               data->flip = 0x8000;
+       data->native_bytes = snd_pcm_format_physical_width(format) / 8;
+       data->copy_bytes = data->native_bytes < 2 ? 1 : 2;
+       if (snd_pcm_format_little_endian(format)) {
+               data->native_ofs = data->native_bytes - data->copy_bytes;
+               data->copy_ofs = 2 - data->copy_bytes;
+       } else {
+               /* S24 in 4bytes need an 1 byte offset */
+               data->native_ofs = data->native_bytes -
+                       snd_pcm_format_width(format) / 8;
+       }
 }
 
 int snd_pcm_plugin_build_mulaw(struct snd_pcm_substream *plug,
@@ -322,11 +333,8 @@ int snd_pcm_plugin_build_mulaw(struct snd_pcm_substream *plug,
                return err;
        data = (struct mulaw_priv *)plugin->extra_data;
        data->func = func;
-       data->conv = getput_index(format->format);
-       snd_assert(data->conv >= 0 && data->conv < 4*2*2, return -EINVAL);
+       init_data(data, format->format);
        plugin->transfer = mulaw_transfer;
        *r_plugin = plugin;
        return 0;
 }
-
-#endif
index fc11572c48cf8038b52d329f9aa12d7ec047f9ca..d0c4ceb9f0b4e55efaff4e16dc2fc585df81a3a4 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Digital Audio (PCM) abstract layer / OSS compatible
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
@@ -48,7 +48,7 @@ static int dsp_map[SNDRV_CARDS];
 static int adsp_map[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = 1};
 static int nonblock_open = 1;
 
-MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>, Abramo Bagnara <abramo@alsa-project.org>");
+MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>, Abramo Bagnara <abramo@alsa-project.org>");
 MODULE_DESCRIPTION("PCM OSS emulation for ALSA.");
 MODULE_LICENSE("GPL");
 module_param_array(dsp_map, int, NULL, 0444);
@@ -633,6 +633,22 @@ static long snd_pcm_alsa_frames(struct snd_pcm_substream *substream, long bytes)
        return bytes_to_frames(runtime, (buffer_size * bytes) / runtime->oss.buffer_bytes);
 }
 
+/* define extended formats in the recent OSS versions (if any) */
+/* linear formats */
+#define AFMT_S32_LE      0x00001000
+#define AFMT_S32_BE      0x00002000
+#define AFMT_S24_LE      0x00008000
+#define AFMT_S24_BE      0x00010000
+#define AFMT_S24_PACKED  0x00040000
+
+/* other supported formats */
+#define AFMT_FLOAT       0x00004000
+#define AFMT_SPDIF_RAW   0x00020000
+
+/* unsupported formats */
+#define AFMT_AC3         0x00000400
+#define AFMT_VORBIS      0x00000800
+
 static int snd_pcm_oss_format_from(int format)
 {
        switch (format) {
@@ -646,6 +662,13 @@ static int snd_pcm_oss_format_from(int format)
        case AFMT_U16_LE:       return SNDRV_PCM_FORMAT_U16_LE;
        case AFMT_U16_BE:       return SNDRV_PCM_FORMAT_U16_BE;
        case AFMT_MPEG:         return SNDRV_PCM_FORMAT_MPEG;
+       case AFMT_S32_LE:       return SNDRV_PCM_FORMAT_S32_LE;
+       case AFMT_S32_BE:       return SNDRV_PCM_FORMAT_S32_BE;
+       case AFMT_S24_LE:       return SNDRV_PCM_FORMAT_S24_LE;
+       case AFMT_S24_BE:       return SNDRV_PCM_FORMAT_S24_BE;
+       case AFMT_S24_PACKED:   return SNDRV_PCM_FORMAT_S24_3LE;
+       case AFMT_FLOAT:        return SNDRV_PCM_FORMAT_FLOAT;
+       case AFMT_SPDIF_RAW:    return SNDRV_PCM_FORMAT_IEC958_SUBFRAME;
        default:                return SNDRV_PCM_FORMAT_U8;
        }
 }
@@ -663,6 +686,13 @@ static int snd_pcm_oss_format_to(int format)
        case SNDRV_PCM_FORMAT_U16_LE:   return AFMT_U16_LE;
        case SNDRV_PCM_FORMAT_U16_BE:   return AFMT_U16_BE;
        case SNDRV_PCM_FORMAT_MPEG:             return AFMT_MPEG;
+       case SNDRV_PCM_FORMAT_S32_LE:   return AFMT_S32_LE;
+       case SNDRV_PCM_FORMAT_S32_BE:   return AFMT_S32_BE;
+       case SNDRV_PCM_FORMAT_S24_LE:   return AFMT_S24_LE;
+       case SNDRV_PCM_FORMAT_S24_BE:   return AFMT_S24_BE;
+       case SNDRV_PCM_FORMAT_S24_3LE:  return AFMT_S24_PACKED;
+       case SNDRV_PCM_FORMAT_FLOAT:    return AFMT_FLOAT;
+       case SNDRV_PCM_FORMAT_IEC958_SUBFRAME: return AFMT_SPDIF_RAW;
        default:                        return -EINVAL;
        }
 }
@@ -1725,7 +1755,10 @@ static int snd_pcm_oss_get_formats(struct snd_pcm_oss_file *pcm_oss_file)
                return AFMT_MU_LAW | AFMT_U8 |
                       AFMT_S16_LE | AFMT_S16_BE |
                       AFMT_S8 | AFMT_U16_LE |
-                      AFMT_U16_BE;
+                      AFMT_U16_BE |
+                       AFMT_S32_LE | AFMT_S32_BE |
+                       AFMT_S24_LE | AFMT_S24_LE |
+                       AFMT_S24_PACKED;
        params = kmalloc(sizeof(*params), GFP_KERNEL);
        if (!params)
                return -ENOMEM;
index 0e67dd280a5d4ea8490b6758f424ec6b4cbdc583..14095a927a1b1b6e9ab7ccf7cded095be969d43c 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  PCM Plug-In shared (kernel/library) code
- *  Copyright (c) 1999 by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) 1999 by Jaroslav Kysela <perex@perex.cz>
  *  Copyright (c) 2000 by Abramo Bagnara <abramo@alsa-project.org>
  *
  *
@@ -25,9 +25,6 @@
 #endif
 
 #include <sound/driver.h>
-
-#ifdef CONFIG_SND_PCM_OSS_PLUGINS
-
 #include <linux/slab.h>
 #include <linux/time.h>
 #include <linux/vmalloc.h>
@@ -267,6 +264,8 @@ static int snd_pcm_plug_formats(struct snd_mask *mask, int format)
                       SNDRV_PCM_FMTBIT_U16_BE | SNDRV_PCM_FMTBIT_S16_BE |
                       SNDRV_PCM_FMTBIT_U24_LE | SNDRV_PCM_FMTBIT_S24_LE |
                       SNDRV_PCM_FMTBIT_U24_BE | SNDRV_PCM_FMTBIT_S24_BE |
+                      SNDRV_PCM_FMTBIT_U24_3LE | SNDRV_PCM_FMTBIT_S24_3LE |
+                      SNDRV_PCM_FMTBIT_U24_3BE | SNDRV_PCM_FMTBIT_S24_3BE |
                       SNDRV_PCM_FMTBIT_U32_LE | SNDRV_PCM_FMTBIT_S32_LE |
                       SNDRV_PCM_FMTBIT_U32_BE | SNDRV_PCM_FMTBIT_S32_BE);
        snd_mask_set(&formats, SNDRV_PCM_FORMAT_MU_LAW);
@@ -283,6 +282,10 @@ static int preferred_formats[] = {
        SNDRV_PCM_FORMAT_S16_BE,
        SNDRV_PCM_FORMAT_U16_LE,
        SNDRV_PCM_FORMAT_U16_BE,
+       SNDRV_PCM_FORMAT_S24_3LE,
+       SNDRV_PCM_FORMAT_S24_3BE,
+       SNDRV_PCM_FORMAT_U24_3LE,
+       SNDRV_PCM_FORMAT_U24_3BE,
        SNDRV_PCM_FORMAT_S24_LE,
        SNDRV_PCM_FORMAT_S24_BE,
        SNDRV_PCM_FORMAT_U24_LE,
@@ -297,41 +300,37 @@ static int preferred_formats[] = {
 
 int snd_pcm_plug_slave_format(int format, struct snd_mask *format_mask)
 {
+       int i;
+
        if (snd_mask_test(format_mask, format))
                return format;
        if (! snd_pcm_plug_formats(format_mask, format))
                return -EINVAL;
        if (snd_pcm_format_linear(format)) {
-               int width = snd_pcm_format_width(format);
-               int unsignd = snd_pcm_format_unsigned(format);
-               int big = snd_pcm_format_big_endian(format);
-               int format1;
-               int wid, width1=width;
-               int dwidth1 = 8;
-               for (wid = 0; wid < 4; ++wid) {
-                       int end, big1 = big;
-                       for (end = 0; end < 2; ++end) {
-                               int sgn, unsignd1 = unsignd;
-                               for (sgn = 0; sgn < 2; ++sgn) {
-                                       format1 = snd_pcm_build_linear_format(width1, unsignd1, big1);
-                                       if (format1 >= 0 &&
-                                           snd_mask_test(format_mask, format1))
-                                               goto _found;
-                                       unsignd1 = !unsignd1;
-                               }
-                               big1 = !big1;
-                       }
-                       if (width1 == 32) {
-                               dwidth1 = -dwidth1;
-                               width1 = width;
+               unsigned int width = snd_pcm_format_width(format);
+               int unsignd = snd_pcm_format_unsigned(format) > 0;
+               int big = snd_pcm_format_big_endian(format) > 0;
+               unsigned int badness, best = -1;
+               int best_format = -1;
+               for (i = 0; i < ARRAY_SIZE(preferred_formats); i++) {
+                       int f = preferred_formats[i];
+                       unsigned int w;
+                       if (!snd_mask_test(format_mask, f))
+                               continue;
+                       w = snd_pcm_format_width(f);
+                       if (w >= width)
+                               badness = w - width;
+                       else
+                               badness = width - w + 32;
+                       badness += snd_pcm_format_unsigned(f) != unsignd;
+                       badness += snd_pcm_format_big_endian(f) != big;
+                       if (badness < best) {
+                               best_format = f;
+                               best = badness;
                        }
-                       width1 += dwidth1;
                }
-               return -EINVAL;
-       _found:
-               return format1;
+               return best_format >= 0 ? best_format : -EINVAL;
        } else {
-               unsigned int i;
                switch (format) {
                case SNDRV_PCM_FORMAT_MU_LAW:
                        for (i = 0; i < ARRAY_SIZE(preferred_formats); ++i) {
@@ -740,5 +739,3 @@ int snd_pcm_area_copy(const struct snd_pcm_channel_area *src_area, size_t src_of
        }
        return 0;
 }
-
-#endif
index 3be91b3d53777cecf86f9fd71ea00e465a522548..ca2f4c39be46e43e3dbb104b5ea1f0e3cc6684b3 100644 (file)
@@ -3,7 +3,7 @@
 
 /*
  *  Digital Audio (Plugin interface) abstract layer
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
diff --git a/sound/core/oss/plugin_ops.h b/sound/core/oss/plugin_ops.h
deleted file mode 100644 (file)
index 1f5bde4..0000000
+++ /dev/null
@@ -1,370 +0,0 @@
-/*
- *  Plugin sample operators with fast switch
- *  Copyright (c) 2000 by Jaroslav Kysela <perex@suse.cz>
- *
- *
- *   This library is free software; you can redistribute it and/or modify
- *   it under the terms of the GNU Library General Public License as
- *   published by the Free Software Foundation; either version 2 of
- *   the License, or (at your option) any later version.
- *
- *   This program is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU Library General Public License for more details.
- *
- *   You should have received a copy of the GNU Library General Public
- *   License along with this library; if not, write to the Free Software
- *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
- *
- */
-
-
-#define as_u8(ptr) (*(u_int8_t*)(ptr))
-#define as_u16(ptr) (*(u_int16_t*)(ptr))
-#define as_u32(ptr) (*(u_int32_t*)(ptr))
-#define as_u64(ptr) (*(u_int64_t*)(ptr))
-#define as_s8(ptr) (*(int8_t*)(ptr))
-#define as_s16(ptr) (*(int16_t*)(ptr))
-#define as_s32(ptr) (*(int32_t*)(ptr))
-#define as_s64(ptr) (*(int64_t*)(ptr))
-
-#ifdef COPY_LABELS
-static void *copy_labels[4] = {
-       &&copy_8,
-       &&copy_16,
-       &&copy_32,
-       &&copy_64
-};
-#endif
-
-#ifdef COPY_END
-while(0) {
-copy_8: as_s8(dst) = as_s8(src); goto COPY_END;
-copy_16: as_s16(dst) = as_s16(src); goto COPY_END;
-copy_32: as_s32(dst) = as_s32(src); goto COPY_END;
-copy_64: as_s64(dst) = as_s64(src); goto COPY_END;
-}
-#endif
-
-#ifdef CONV_LABELS
-/* src_wid src_endswap sign_toggle dst_wid dst_endswap */
-static void *conv_labels[4 * 2 * 2 * 4 * 2] = {
-       &&conv_xxx1_xxx1,        /*  8h ->  8h */
-       &&conv_xxx1_xxx1,        /*  8h ->  8s */
-       &&conv_xxx1_xx10,        /*  8h -> 16h */
-       &&conv_xxx1_xx01,        /*  8h -> 16s */
-       &&conv_xxx1_x100,        /*  8h -> 24h */
-       &&conv_xxx1_001x,        /*  8h -> 24s */
-       &&conv_xxx1_1000,        /*  8h -> 32h */
-       &&conv_xxx1_0001,        /*  8h -> 32s */
-       &&conv_xxx1_xxx9,        /*  8h ^>  8h */
-       &&conv_xxx1_xxx9,        /*  8h ^>  8s */
-       &&conv_xxx1_xx90,        /*  8h ^> 16h */
-       &&conv_xxx1_xx09,        /*  8h ^> 16s */
-       &&conv_xxx1_x900,        /*  8h ^> 24h */
-       &&conv_xxx1_009x,        /*  8h ^> 24s */
-       &&conv_xxx1_9000,        /*  8h ^> 32h */
-       &&conv_xxx1_0009,        /*  8h ^> 32s */
-       &&conv_xxx1_xxx1,        /*  8s ->  8h */
-       &&conv_xxx1_xxx1,        /*  8s ->  8s */
-       &&conv_xxx1_xx10,        /*  8s -> 16h */
-       &&conv_xxx1_xx01,        /*  8s -> 16s */
-       &&conv_xxx1_x100,        /*  8s -> 24h */
-       &&conv_xxx1_001x,        /*  8s -> 24s */
-       &&conv_xxx1_1000,        /*  8s -> 32h */
-       &&conv_xxx1_0001,        /*  8s -> 32s */
-       &&conv_xxx1_xxx9,        /*  8s ^>  8h */
-       &&conv_xxx1_xxx9,        /*  8s ^>  8s */
-       &&conv_xxx1_xx90,        /*  8s ^> 16h */
-       &&conv_xxx1_xx09,        /*  8s ^> 16s */
-       &&conv_xxx1_x900,        /*  8s ^> 24h */
-       &&conv_xxx1_009x,        /*  8s ^> 24s */
-       &&conv_xxx1_9000,        /*  8s ^> 32h */
-       &&conv_xxx1_0009,        /*  8s ^> 32s */
-       &&conv_xx12_xxx1,        /* 16h ->  8h */
-       &&conv_xx12_xxx1,        /* 16h ->  8s */
-       &&conv_xx12_xx12,        /* 16h -> 16h */
-       &&conv_xx12_xx21,        /* 16h -> 16s */
-       &&conv_xx12_x120,        /* 16h -> 24h */
-       &&conv_xx12_021x,        /* 16h -> 24s */
-       &&conv_xx12_1200,        /* 16h -> 32h */
-       &&conv_xx12_0021,        /* 16h -> 32s */
-       &&conv_xx12_xxx9,        /* 16h ^>  8h */
-       &&conv_xx12_xxx9,        /* 16h ^>  8s */
-       &&conv_xx12_xx92,        /* 16h ^> 16h */
-       &&conv_xx12_xx29,        /* 16h ^> 16s */
-       &&conv_xx12_x920,        /* 16h ^> 24h */
-       &&conv_xx12_029x,        /* 16h ^> 24s */
-       &&conv_xx12_9200,        /* 16h ^> 32h */
-       &&conv_xx12_0029,        /* 16h ^> 32s */
-       &&conv_xx12_xxx2,        /* 16s ->  8h */
-       &&conv_xx12_xxx2,        /* 16s ->  8s */
-       &&conv_xx12_xx21,        /* 16s -> 16h */
-       &&conv_xx12_xx12,        /* 16s -> 16s */
-       &&conv_xx12_x210,        /* 16s -> 24h */
-       &&conv_xx12_012x,        /* 16s -> 24s */
-       &&conv_xx12_2100,        /* 16s -> 32h */
-       &&conv_xx12_0012,        /* 16s -> 32s */
-       &&conv_xx12_xxxA,        /* 16s ^>  8h */
-       &&conv_xx12_xxxA,        /* 16s ^>  8s */
-       &&conv_xx12_xxA1,        /* 16s ^> 16h */
-       &&conv_xx12_xx1A,        /* 16s ^> 16s */
-       &&conv_xx12_xA10,        /* 16s ^> 24h */
-       &&conv_xx12_01Ax,        /* 16s ^> 24s */
-       &&conv_xx12_A100,        /* 16s ^> 32h */
-       &&conv_xx12_001A,        /* 16s ^> 32s */
-       &&conv_x123_xxx1,        /* 24h ->  8h */
-       &&conv_x123_xxx1,        /* 24h ->  8s */
-       &&conv_x123_xx12,        /* 24h -> 16h */
-       &&conv_x123_xx21,        /* 24h -> 16s */
-       &&conv_x123_x123,        /* 24h -> 24h */
-       &&conv_x123_321x,        /* 24h -> 24s */
-       &&conv_x123_1230,        /* 24h -> 32h */
-       &&conv_x123_0321,        /* 24h -> 32s */
-       &&conv_x123_xxx9,        /* 24h ^>  8h */
-       &&conv_x123_xxx9,        /* 24h ^>  8s */
-       &&conv_x123_xx92,        /* 24h ^> 16h */
-       &&conv_x123_xx29,        /* 24h ^> 16s */
-       &&conv_x123_x923,        /* 24h ^> 24h */
-       &&conv_x123_329x,        /* 24h ^> 24s */
-       &&conv_x123_9230,        /* 24h ^> 32h */
-       &&conv_x123_0329,        /* 24h ^> 32s */
-       &&conv_123x_xxx3,        /* 24s ->  8h */
-       &&conv_123x_xxx3,        /* 24s ->  8s */
-       &&conv_123x_xx32,        /* 24s -> 16h */
-       &&conv_123x_xx23,        /* 24s -> 16s */
-       &&conv_123x_x321,        /* 24s -> 24h */
-       &&conv_123x_123x,        /* 24s -> 24s */
-       &&conv_123x_3210,        /* 24s -> 32h */
-       &&conv_123x_0123,        /* 24s -> 32s */
-       &&conv_123x_xxxB,        /* 24s ^>  8h */
-       &&conv_123x_xxxB,        /* 24s ^>  8s */
-       &&conv_123x_xxB2,        /* 24s ^> 16h */
-       &&conv_123x_xx2B,        /* 24s ^> 16s */
-       &&conv_123x_xB21,        /* 24s ^> 24h */
-       &&conv_123x_12Bx,        /* 24s ^> 24s */
-       &&conv_123x_B210,        /* 24s ^> 32h */
-       &&conv_123x_012B,        /* 24s ^> 32s */
-       &&conv_1234_xxx1,        /* 32h ->  8h */
-       &&conv_1234_xxx1,        /* 32h ->  8s */
-       &&conv_1234_xx12,        /* 32h -> 16h */
-       &&conv_1234_xx21,        /* 32h -> 16s */
-       &&conv_1234_x123,        /* 32h -> 24h */
-       &&conv_1234_321x,        /* 32h -> 24s */
-       &&conv_1234_1234,        /* 32h -> 32h */
-       &&conv_1234_4321,        /* 32h -> 32s */
-       &&conv_1234_xxx9,        /* 32h ^>  8h */
-       &&conv_1234_xxx9,        /* 32h ^>  8s */
-       &&conv_1234_xx92,        /* 32h ^> 16h */
-       &&conv_1234_xx29,        /* 32h ^> 16s */
-       &&conv_1234_x923,        /* 32h ^> 24h */
-       &&conv_1234_329x,        /* 32h ^> 24s */
-       &&conv_1234_9234,        /* 32h ^> 32h */
-       &&conv_1234_4329,        /* 32h ^> 32s */
-       &&conv_1234_xxx4,        /* 32s ->  8h */
-       &&conv_1234_xxx4,        /* 32s ->  8s */
-       &&conv_1234_xx43,        /* 32s -> 16h */
-       &&conv_1234_xx34,        /* 32s -> 16s */
-       &&conv_1234_x432,        /* 32s -> 24h */
-       &&conv_1234_234x,        /* 32s -> 24s */
-       &&conv_1234_4321,        /* 32s -> 32h */
-       &&conv_1234_1234,        /* 32s -> 32s */
-       &&conv_1234_xxxC,        /* 32s ^>  8h */
-       &&conv_1234_xxxC,        /* 32s ^>  8s */
-       &&conv_1234_xxC3,        /* 32s ^> 16h */
-       &&conv_1234_xx3C,        /* 32s ^> 16s */
-       &&conv_1234_xC32,        /* 32s ^> 24h */
-       &&conv_1234_23Cx,        /* 32s ^> 24s */
-       &&conv_1234_C321,        /* 32s ^> 32h */
-       &&conv_1234_123C,        /* 32s ^> 32s */
-};
-#endif
-
-#ifdef CONV_END
-while(0) {
-conv_xxx1_xxx1: as_u8(dst) = as_u8(src); goto CONV_END;
-conv_xxx1_xx10: as_u16(dst) = (u_int16_t)as_u8(src) << 8; goto CONV_END;
-conv_xxx1_xx01: as_u16(dst) = (u_int16_t)as_u8(src); goto CONV_END;
-conv_xxx1_x100: as_u32(dst) = (u_int32_t)as_u8(src) << 16; goto CONV_END;
-conv_xxx1_001x: as_u32(dst) = (u_int32_t)as_u8(src) << 8; goto CONV_END;
-conv_xxx1_1000: as_u32(dst) = (u_int32_t)as_u8(src) << 24; goto CONV_END;
-conv_xxx1_0001: as_u32(dst) = (u_int32_t)as_u8(src); goto CONV_END;
-conv_xxx1_xxx9: as_u8(dst) = as_u8(src) ^ 0x80; goto CONV_END;
-conv_xxx1_xx90: as_u16(dst) = (u_int16_t)(as_u8(src) ^ 0x80) << 8; goto CONV_END;
-conv_xxx1_xx09: as_u16(dst) = (u_int16_t)(as_u8(src) ^ 0x80); goto CONV_END;
-conv_xxx1_x900: as_u32(dst) = (u_int32_t)(as_u8(src) ^ 0x80) << 16; goto CONV_END;
-conv_xxx1_009x: as_u32(dst) = (u_int32_t)(as_u8(src) ^ 0x80) << 8; goto CONV_END;
-conv_xxx1_9000: as_u32(dst) = (u_int32_t)(as_u8(src) ^ 0x80) << 24; goto CONV_END;
-conv_xxx1_0009: as_u32(dst) = (u_int32_t)(as_u8(src) ^ 0x80); goto CONV_END;
-conv_xx12_xxx1: as_u8(dst) = as_u16(src) >> 8; goto CONV_END;
-conv_xx12_xx12: as_u16(dst) = as_u16(src); goto CONV_END;
-conv_xx12_xx21: as_u16(dst) = swab16(as_u16(src)); goto CONV_END;
-conv_xx12_x120: as_u32(dst) = (u_int32_t)as_u16(src) << 8; goto CONV_END;
-conv_xx12_021x: as_u32(dst) = (u_int32_t)swab16(as_u16(src)) << 8; goto CONV_END;
-conv_xx12_1200: as_u32(dst) = (u_int32_t)as_u16(src) << 16; goto CONV_END;
-conv_xx12_0021: as_u32(dst) = (u_int32_t)swab16(as_u16(src)); goto CONV_END;
-conv_xx12_xxx9: as_u8(dst) = (as_u16(src) >> 8) ^ 0x80; goto CONV_END;
-conv_xx12_xx92: as_u16(dst) = as_u16(src) ^ 0x8000; goto CONV_END;
-conv_xx12_xx29: as_u16(dst) = swab16(as_u16(src)) ^ 0x80; goto CONV_END;
-conv_xx12_x920: as_u32(dst) = (u_int32_t)(as_u16(src) ^ 0x8000) << 8; goto CONV_END;
-conv_xx12_029x: as_u32(dst) = (u_int32_t)(swab16(as_u16(src)) ^ 0x80) << 8; goto CONV_END;
-conv_xx12_9200: as_u32(dst) = (u_int32_t)(as_u16(src) ^ 0x8000) << 16; goto CONV_END;
-conv_xx12_0029: as_u32(dst) = (u_int32_t)(swab16(as_u16(src)) ^ 0x80); goto CONV_END;
-conv_xx12_xxx2: as_u8(dst) = as_u16(src) & 0xff; goto CONV_END;
-conv_xx12_x210: as_u32(dst) = (u_int32_t)swab16(as_u16(src)) << 8; goto CONV_END;
-conv_xx12_012x: as_u32(dst) = (u_int32_t)as_u16(src) << 8; goto CONV_END;
-conv_xx12_2100: as_u32(dst) = (u_int32_t)swab16(as_u16(src)) << 16; goto CONV_END;
-conv_xx12_0012: as_u32(dst) = (u_int32_t)as_u16(src); goto CONV_END; 
-conv_xx12_xxxA: as_u8(dst) = (as_u16(src) ^ 0x80) & 0xff; goto CONV_END;
-conv_xx12_xxA1: as_u16(dst) = swab16(as_u16(src) ^ 0x80); goto CONV_END;
-conv_xx12_xx1A: as_u16(dst) = as_u16(src) ^ 0x80; goto CONV_END;
-conv_xx12_xA10: as_u32(dst) = (u_int32_t)swab16(as_u16(src) ^ 0x80) << 8; goto CONV_END;
-conv_xx12_01Ax: as_u32(dst) = (u_int32_t)(as_u16(src) ^ 0x80) << 8; goto CONV_END;
-conv_xx12_A100: as_u32(dst) = (u_int32_t)swab16(as_u16(src) ^ 0x80) << 16; goto CONV_END;
-conv_xx12_001A: as_u32(dst) = (u_int32_t)(as_u16(src) ^ 0x80); goto CONV_END;
-conv_x123_xxx1: as_u8(dst) = as_u32(src) >> 16; goto CONV_END;
-conv_x123_xx12: as_u16(dst) = as_u32(src) >> 8; goto CONV_END;
-conv_x123_xx21: as_u16(dst) = swab16(as_u32(src) >> 8); goto CONV_END;
-conv_x123_x123: as_u32(dst) = as_u32(src); goto CONV_END;
-conv_x123_321x: as_u32(dst) = swab32(as_u32(src)); goto CONV_END;
-conv_x123_1230: as_u32(dst) = as_u32(src) << 8; goto CONV_END;
-conv_x123_0321: as_u32(dst) = swab32(as_u32(src)) >> 8; goto CONV_END;
-conv_x123_xxx9: as_u8(dst) = (as_u32(src) >> 16) ^ 0x80; goto CONV_END;
-conv_x123_xx92: as_u16(dst) = (as_u32(src) >> 8) ^ 0x8000; goto CONV_END;
-conv_x123_xx29: as_u16(dst) = swab16(as_u32(src) >> 8) ^ 0x80; goto CONV_END;
-conv_x123_x923: as_u32(dst) = as_u32(src) ^ 0x800000; goto CONV_END;
-conv_x123_329x: as_u32(dst) = swab32(as_u32(src)) ^ 0x8000; goto CONV_END;
-conv_x123_9230: as_u32(dst) = (as_u32(src) ^ 0x800000) << 8; goto CONV_END;
-conv_x123_0329: as_u32(dst) = (swab32(as_u32(src)) >> 8) ^ 0x80; goto CONV_END;
-conv_123x_xxx3: as_u8(dst) = (as_u32(src) >> 8) & 0xff; goto CONV_END;
-conv_123x_xx32: as_u16(dst) = swab16(as_u32(src) >> 8); goto CONV_END;
-conv_123x_xx23: as_u16(dst) = (as_u32(src) >> 8) & 0xffff; goto CONV_END;
-conv_123x_x321: as_u32(dst) = swab32(as_u32(src)); goto CONV_END;
-conv_123x_123x: as_u32(dst) = as_u32(src); goto CONV_END;
-conv_123x_3210: as_u32(dst) = swab32(as_u32(src)) << 8; goto CONV_END;
-conv_123x_0123: as_u32(dst) = as_u32(src) >> 8; goto CONV_END;
-conv_123x_xxxB: as_u8(dst) = ((as_u32(src) >> 8) & 0xff) ^ 0x80; goto CONV_END;
-conv_123x_xxB2: as_u16(dst) = swab16((as_u32(src) >> 8) ^ 0x80); goto CONV_END;
-conv_123x_xx2B: as_u16(dst) = ((as_u32(src) >> 8) & 0xffff) ^ 0x80; goto CONV_END;
-conv_123x_xB21: as_u32(dst) = swab32(as_u32(src)) ^ 0x800000; goto CONV_END;
-conv_123x_12Bx: as_u32(dst) = as_u32(src) ^ 0x8000; goto CONV_END;
-conv_123x_B210: as_u32(dst) = swab32(as_u32(src) ^ 0x8000) << 8; goto CONV_END;
-conv_123x_012B: as_u32(dst) = (as_u32(src) >> 8) ^ 0x80; goto CONV_END;
-conv_1234_xxx1: as_u8(dst) = as_u32(src) >> 24; goto CONV_END;
-conv_1234_xx12: as_u16(dst) = as_u32(src) >> 16; goto CONV_END;
-conv_1234_xx21: as_u16(dst) = swab16(as_u32(src) >> 16); goto CONV_END;
-conv_1234_x123: as_u32(dst) = as_u32(src) >> 8; goto CONV_END;
-conv_1234_321x: as_u32(dst) = swab32(as_u32(src)) << 8; goto CONV_END;
-conv_1234_1234: as_u32(dst) = as_u32(src); goto CONV_END;
-conv_1234_4321: as_u32(dst) = swab32(as_u32(src)); goto CONV_END;
-conv_1234_xxx9: as_u8(dst) = (as_u32(src) >> 24) ^ 0x80; goto CONV_END;
-conv_1234_xx92: as_u16(dst) = (as_u32(src) >> 16) ^ 0x8000; goto CONV_END;
-conv_1234_xx29: as_u16(dst) = swab16(as_u32(src) >> 16) ^ 0x80; goto CONV_END;
-conv_1234_x923: as_u32(dst) = (as_u32(src) >> 8) ^ 0x800000; goto CONV_END;
-conv_1234_329x: as_u32(dst) = (swab32(as_u32(src)) ^ 0x80) << 8; goto CONV_END;
-conv_1234_9234: as_u32(dst) = as_u32(src) ^ 0x80000000; goto CONV_END;
-conv_1234_4329: as_u32(dst) = swab32(as_u32(src)) ^ 0x80; goto CONV_END;
-conv_1234_xxx4: as_u8(dst) = as_u32(src) & 0xff; goto CONV_END;
-conv_1234_xx43: as_u16(dst) = swab16(as_u32(src)); goto CONV_END;
-conv_1234_xx34: as_u16(dst) = as_u32(src) & 0xffff; goto CONV_END;
-conv_1234_x432: as_u32(dst) = swab32(as_u32(src)) >> 8; goto CONV_END;
-conv_1234_234x: as_u32(dst) = as_u32(src) << 8; goto CONV_END;
-conv_1234_xxxC: as_u8(dst) = (as_u32(src) & 0xff) ^ 0x80; goto CONV_END;
-conv_1234_xxC3: as_u16(dst) = swab16(as_u32(src) ^ 0x80); goto CONV_END;
-conv_1234_xx3C: as_u16(dst) = (as_u32(src) & 0xffff) ^ 0x80; goto CONV_END;
-conv_1234_xC32: as_u32(dst) = (swab32(as_u32(src)) >> 8) ^ 0x800000; goto CONV_END;
-conv_1234_23Cx: as_u32(dst) = (as_u32(src) ^ 0x80) << 8; goto CONV_END;
-conv_1234_C321: as_u32(dst) = swab32(as_u32(src) ^ 0x80); goto CONV_END;
-conv_1234_123C: as_u32(dst) = as_u32(src) ^ 0x80; goto CONV_END;
-}
-#endif
-
-#ifdef GET_S16_LABELS
-/* src_wid src_endswap unsigned */
-static void *get_s16_labels[4 * 2 * 2] = {
-       &&get_s16_xxx1_xx10,     /*  8h -> 16h */
-       &&get_s16_xxx1_xx90,     /*  8h ^> 16h */
-       &&get_s16_xxx1_xx10,     /*  8s -> 16h */
-       &&get_s16_xxx1_xx90,     /*  8s ^> 16h */
-       &&get_s16_xx12_xx12,     /* 16h -> 16h */
-       &&get_s16_xx12_xx92,     /* 16h ^> 16h */
-       &&get_s16_xx12_xx21,     /* 16s -> 16h */
-       &&get_s16_xx12_xxA1,     /* 16s ^> 16h */
-       &&get_s16_x123_xx12,     /* 24h -> 16h */
-       &&get_s16_x123_xx92,     /* 24h ^> 16h */
-       &&get_s16_123x_xx32,     /* 24s -> 16h */
-       &&get_s16_123x_xxB2,     /* 24s ^> 16h */
-       &&get_s16_1234_xx12,     /* 32h -> 16h */
-       &&get_s16_1234_xx92,     /* 32h ^> 16h */
-       &&get_s16_1234_xx43,     /* 32s -> 16h */
-       &&get_s16_1234_xxC3,     /* 32s ^> 16h */
-};
-#endif
-
-#ifdef GET_S16_END
-while(0) {
-get_s16_xxx1_xx10: sample = (u_int16_t)as_u8(src) << 8; goto GET_S16_END;
-get_s16_xxx1_xx90: sample = (u_int16_t)(as_u8(src) ^ 0x80) << 8; goto GET_S16_END;
-get_s16_xx12_xx12: sample = as_u16(src); goto GET_S16_END;
-get_s16_xx12_xx92: sample = as_u16(src) ^ 0x8000; goto GET_S16_END;
-get_s16_xx12_xx21: sample = swab16(as_u16(src)); goto GET_S16_END;
-get_s16_xx12_xxA1: sample = swab16(as_u16(src) ^ 0x80); goto GET_S16_END;
-get_s16_x123_xx12: sample = as_u32(src) >> 8; goto GET_S16_END;
-get_s16_x123_xx92: sample = (as_u32(src) >> 8) ^ 0x8000; goto GET_S16_END;
-get_s16_123x_xx32: sample = swab16(as_u32(src) >> 8); goto GET_S16_END;
-get_s16_123x_xxB2: sample = swab16((as_u32(src) >> 8) ^ 0x8000); goto GET_S16_END;
-get_s16_1234_xx12: sample = as_u32(src) >> 16; goto GET_S16_END;
-get_s16_1234_xx92: sample = (as_u32(src) >> 16) ^ 0x8000; goto GET_S16_END;
-get_s16_1234_xx43: sample = swab16(as_u32(src)); goto GET_S16_END;
-get_s16_1234_xxC3: sample = swab16(as_u32(src) ^ 0x80); goto GET_S16_END;
-}
-#endif
-
-#ifdef PUT_S16_LABELS
-/* dst_wid dst_endswap unsigned */
-static void *put_s16_labels[4 * 2 * 2] = {
-       &&put_s16_xx12_xxx1,     /* 16h ->  8h */
-       &&put_s16_xx12_xxx9,     /* 16h ^>  8h */
-       &&put_s16_xx12_xxx1,     /* 16h ->  8s */
-       &&put_s16_xx12_xxx9,     /* 16h ^>  8s */
-       &&put_s16_xx12_xx12,     /* 16h -> 16h */
-       &&put_s16_xx12_xx92,     /* 16h ^> 16h */
-       &&put_s16_xx12_xx21,     /* 16h -> 16s */
-       &&put_s16_xx12_xx29,     /* 16h ^> 16s */
-       &&put_s16_xx12_x120,     /* 16h -> 24h */
-       &&put_s16_xx12_x920,     /* 16h ^> 24h */
-       &&put_s16_xx12_021x,     /* 16h -> 24s */
-       &&put_s16_xx12_029x,     /* 16h ^> 24s */
-       &&put_s16_xx12_1200,     /* 16h -> 32h */
-       &&put_s16_xx12_9200,     /* 16h ^> 32h */
-       &&put_s16_xx12_0021,     /* 16h -> 32s */
-       &&put_s16_xx12_0029,     /* 16h ^> 32s */
-};
-#endif
-
-#ifdef PUT_S16_END
-while (0) {
-put_s16_xx12_xxx1: as_u8(dst) = sample >> 8; goto PUT_S16_END;
-put_s16_xx12_xxx9: as_u8(dst) = (sample >> 8) ^ 0x80; goto PUT_S16_END;
-put_s16_xx12_xx12: as_u16(dst) = sample; goto PUT_S16_END;
-put_s16_xx12_xx92: as_u16(dst) = sample ^ 0x8000; goto PUT_S16_END;
-put_s16_xx12_xx21: as_u16(dst) = swab16(sample); goto PUT_S16_END;
-put_s16_xx12_xx29: as_u16(dst) = swab16(sample) ^ 0x80; goto PUT_S16_END;
-put_s16_xx12_x120: as_u32(dst) = (u_int32_t)sample << 8; goto PUT_S16_END;
-put_s16_xx12_x920: as_u32(dst) = (u_int32_t)(sample ^ 0x8000) << 8; goto PUT_S16_END;
-put_s16_xx12_021x: as_u32(dst) = (u_int32_t)swab16(sample) << 8; goto PUT_S16_END;
-put_s16_xx12_029x: as_u32(dst) = (u_int32_t)(swab16(sample) ^ 0x80) << 8; goto PUT_S16_END;
-put_s16_xx12_1200: as_u32(dst) = (u_int32_t)sample << 16; goto PUT_S16_END;
-put_s16_xx12_9200: as_u32(dst) = (u_int32_t)(sample ^ 0x8000) << 16; goto PUT_S16_END;
-put_s16_xx12_0021: as_u32(dst) = (u_int32_t)swab16(sample); goto PUT_S16_END;
-put_s16_xx12_0029: as_u32(dst) = (u_int32_t)swab16(sample) ^ 0x80; goto PUT_S16_END;
-}
-#endif
-
-#undef as_u8
-#undef as_u16
-#undef as_u32
-#undef as_s8
-#undef as_s16
-#undef as_s32
index 18d8a0f4e8168a0b145b2179673f24a1b1c29f48..9eb267913c3814fcb1c194670bb0b208bf06fc33 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Rate conversion Plug-In
- *  Copyright (c) 1999 by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) 1999 by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This library is free software; you can redistribute it and/or modify
@@ -20,9 +20,6 @@
  */
   
 #include <sound/driver.h>
-
-#ifdef CONFIG_SND_PCM_OSS_PLUGINS
-
 #include <linux/time.h>
 #include <sound/core.h>
 #include <sound/pcm.h>
@@ -340,5 +337,3 @@ int snd_pcm_plugin_build_rate(struct snd_pcm_substream *plug,
        *r_plugin = plugin;
        return 0;
 }
-
-#endif
index 46917dc0196b3bae00de5f08350219f3e9a24d1f..de3ffdeaf7e346de505337c3461a9979e5ce0224 100644 (file)
@@ -20,9 +20,6 @@
  */
 
 #include <sound/driver.h>
-
-#ifdef CONFIG_SND_PCM_OSS_PLUGINS
-
 #include <linux/slab.h>
 #include <linux/time.h>
 #include <sound/core.h>
@@ -108,5 +105,3 @@ int snd_pcm_plugin_build_route(struct snd_pcm_substream *plug,
        *r_plugin = plugin;
        return 0;
 }
-
-#endif
index 2743414fc8fa8ac7fbf14d9b49dc38be622eea0a..cf9b9493d41deba8810dfe266353e294d7d05af1 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Digital Audio (PCM) abstract layer
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
@@ -30,7 +30,7 @@
 #include <sound/control.h>
 #include <sound/info.h>
 
-MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>, Abramo Bagnara <abramo@alsa-project.org>");
+MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>, Abramo Bagnara <abramo@alsa-project.org>");
 MODULE_DESCRIPTION("Midlevel PCM code for ALSA.");
 MODULE_LICENSE("GPL");
 
index 9fefcaa2c324e5a4c740a9653945185a212e5374..806f1fba5446d1f639309d203f55d2de2db268cc 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Digital Audio (PCM) abstract layer
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *                   Abramo Bagnara <abramo@alsa-project.org>
  *
  *
index 95b1b2f0b1e23a81d1498ca62023defda6ad63c4..a13e38cfd2c62fea7d85bf8bf12f59f9cbf0a347 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Digital Audio (PCM) abstract layer
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
index 0019c59a779d25a0cc772826d03a0de2f3d75957..dd9aa51d8c820b0ecfcf1d6999daf50008a41427 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  PCM Interface - misc routines
- *  Copyright (c) 1998 by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) 1998 by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This library is free software; you can redistribute it and/or modify
@@ -422,38 +422,6 @@ int snd_pcm_format_set_silence(snd_pcm_format_t format, void *data, unsigned int
 
 EXPORT_SYMBOL(snd_pcm_format_set_silence);
 
-/* [width][unsigned][bigendian] */
-static int linear_formats[4][2][2] = {
-       {{ SNDRV_PCM_FORMAT_S8, SNDRV_PCM_FORMAT_S8},
-        { SNDRV_PCM_FORMAT_U8, SNDRV_PCM_FORMAT_U8}},
-       {{SNDRV_PCM_FORMAT_S16_LE, SNDRV_PCM_FORMAT_S16_BE},
-        {SNDRV_PCM_FORMAT_U16_LE, SNDRV_PCM_FORMAT_U16_BE}},
-       {{SNDRV_PCM_FORMAT_S24_LE, SNDRV_PCM_FORMAT_S24_BE},
-        {SNDRV_PCM_FORMAT_U24_LE, SNDRV_PCM_FORMAT_U24_BE}},
-       {{SNDRV_PCM_FORMAT_S32_LE, SNDRV_PCM_FORMAT_S32_BE},
-        {SNDRV_PCM_FORMAT_U32_LE, SNDRV_PCM_FORMAT_U32_BE}}
-};
-
-/**
- * snd_pcm_build_linear_format - return the suitable linear format for the given condition
- * @width: the bit-width
- * @unsignd: 1 if unsigned, 0 if signed.
- * @big_endian: 1 if big-endian, 0 if little-endian
- *
- * Returns the suitable linear format for the given condition.
- */
-snd_pcm_format_t snd_pcm_build_linear_format(int width, int unsignd, int big_endian)
-{
-       if (width & 7)
-               return SND_PCM_FORMAT_UNKNOWN;
-       width = (width / 8) - 1;
-       if (width < 0 || width >= 4)
-               return SND_PCM_FORMAT_UNKNOWN;
-       return linear_formats[width][!!unsignd][!!big_endian];
-}
-
-EXPORT_SYMBOL(snd_pcm_build_linear_format);
-
 /**
  * snd_pcm_limit_hw_rates - determine rate_min/rate_max fields
  * @runtime: the runtime instance
@@ -465,21 +433,16 @@ EXPORT_SYMBOL(snd_pcm_build_linear_format);
  */
 int snd_pcm_limit_hw_rates(struct snd_pcm_runtime *runtime)
 {
-       static unsigned rates[] = {
-               /* ATTENTION: these values depend on the definition in pcm.h! */
-               5512, 8000, 11025, 16000, 22050, 32000, 44100, 48000,
-               64000, 88200, 96000, 176400, 192000
-       };
        int i;
-       for (i = 0; i < (int)ARRAY_SIZE(rates); i++) {
+       for (i = 0; i < (int)snd_pcm_known_rates.count; i++) {
                if (runtime->hw.rates & (1 << i)) {
-                       runtime->hw.rate_min = rates[i];
+                       runtime->hw.rate_min = snd_pcm_known_rates.list[i];
                        break;
                }
        }
-       for (i = (int)ARRAY_SIZE(rates) - 1; i >= 0; i--) {
+       for (i = (int)snd_pcm_known_rates.count - 1; i >= 0; i--) {
                if (runtime->hw.rates & (1 << i)) {
-                       runtime->hw.rate_max = rates[i];
+                       runtime->hw.rate_max = snd_pcm_known_rates.list[i];
                        break;
                }
        }
@@ -487,3 +450,21 @@ int snd_pcm_limit_hw_rates(struct snd_pcm_runtime *runtime)
 }
 
 EXPORT_SYMBOL(snd_pcm_limit_hw_rates);
+
+/**
+ * snd_pcm_rate_to_rate_bit - converts sample rate to SNDRV_PCM_RATE_xxx bit
+ * @rate: the sample rate to convert
+ *
+ * Returns the SNDRV_PCM_RATE_xxx flag that corresponds to the given rate, or
+ * SNDRV_PCM_RATE_KNOT for an unknown rate.
+ */
+unsigned int snd_pcm_rate_to_rate_bit(unsigned int rate)
+{
+       unsigned int i;
+
+       for (i = 0; i < snd_pcm_known_rates.count; i++)
+               if (snd_pcm_known_rates.list[i] == rate)
+                       return 1u << i;
+       return SNDRV_PCM_RATE_KNOT;
+}
+EXPORT_SYMBOL(snd_pcm_rate_to_rate_bit);
index 59b29cd482aed51bb1fd0c5b8553dd3470ccb41a..fb3dde4db0454fcf9927b80f8a3ba55a0263267b 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Digital Audio (PCM) abstract layer
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
@@ -1787,12 +1787,18 @@ static int snd_pcm_hw_rule_sample_bits(struct snd_pcm_hw_params *params,
 static unsigned int rates[] = { 5512, 8000, 11025, 16000, 22050, 32000, 44100,
                                  48000, 64000, 88200, 96000, 176400, 192000 };
 
+const struct snd_pcm_hw_constraint_list snd_pcm_known_rates = {
+       .count = ARRAY_SIZE(rates),
+       .list = rates,
+};
+
 static int snd_pcm_hw_rule_rate(struct snd_pcm_hw_params *params,
                                struct snd_pcm_hw_rule *rule)
 {
        struct snd_pcm_hardware *hw = rule->private;
        return snd_interval_list(hw_param_interval(params, rule->var),
-                                ARRAY_SIZE(rates), rates, hw->rates);
+                                snd_pcm_known_rates.count,
+                                snd_pcm_known_rates.list, hw->rates);
 }              
 
 static int snd_pcm_hw_rule_buffer_bytes_max(struct snd_pcm_hw_params *params,
index d94ed16d21ea9dac3e93d776b116f8c25b8def6c..23aa9a27e2158f8cd2173b6e66d12887a4432453 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Digital Audio (PCM) abstract layer
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
index e470c3c7d61162011b5dde5ff31c13f825e3a010..b8e700b94e5962b24a9355be54f2548753633eb7 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Abstract layer for MIDI v1.0 stream
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
 #include <linux/mutex.h>
 #include <linux/moduleparam.h>
 #include <linux/delay.h>
-#include <linux/wait.h>
 #include <sound/rawmidi.h>
 #include <sound/info.h>
 #include <sound/control.h>
 #include <sound/minors.h>
 #include <sound/initval.h>
 
-MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>");
+MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>");
 MODULE_DESCRIPTION("Midlevel RawMidi code for ALSA.");
 MODULE_LICENSE("GPL");
 
index 402e2b4a34c618d14a7cb31e4fb196eeef617f56..ceef14afee3002dda5f6b7eff7ea076a41011a53 100644 (file)
@@ -1,6 +1,6 @@
 #
 # Makefile for ALSA
-# Copyright (c) 1999 by Jaroslav Kysela <perex@suse.cz>
+# Copyright (c) 1999 by Jaroslav Kysela <perex@perex.cz>
 #
 
 obj-$(CONFIG_SND) += instr/
index 69138f30a29368f29218a37af84acc5644a0e20b..608960364813fb808c944b2d1ffed37799de55e0 100644 (file)
@@ -1,6 +1,6 @@
 #
 # Makefile for ALSA
-# Copyright (c) 1999 by Jaroslav Kysela <perex@suse.cz>
+# Copyright (c) 1999 by Jaroslav Kysela <perex@perex.cz>
 #
 
 snd-ainstr-fm-objs := ainstr_fm.o
index c640e1cf854d2ae9af99b4afe02f1c5f87c717e6..49400262b1eb3b33b862d415c4de7189cc4ec687 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *   GF1 (GUS) Patch - Instrument routines
- *   Copyright (c) 1999 by Jaroslav Kysela <perex@suse.cz>
+ *   Copyright (c) 1999 by Jaroslav Kysela <perex@perex.cz>
  *
  *   This program is free software; you can redistribute it and/or modify
  *   it under the terms of the GNU General Public License as published by
@@ -26,7 +26,7 @@
 #include <sound/initval.h>
 #include <asm/uaccess.h>
 
-MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>");
+MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>");
 MODULE_DESCRIPTION("Advanced Linux Sound Architecture GF1 (GUS) Patch support.");
 MODULE_LICENSE("GPL");
 
index 5367baee2d08b87dfd2c1a48b3336e2899659713..6c40eb73fa9fa7b95be8e8d011591f1f22dc5a1b 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *   IWFFFF - AMD InterWave (tm) - Instrument routines
- *   Copyright (c) 1999 by Jaroslav Kysela <perex@suse.cz>
+ *   Copyright (c) 1999 by Jaroslav Kysela <perex@perex.cz>
  *
  *   This program is free software; you can redistribute it and/or modify
  *   it under the terms of the GNU General Public License as published by
@@ -26,7 +26,7 @@
 #include <sound/initval.h>
 #include <asm/uaccess.h>
 
-MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>");
+MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>");
 MODULE_DESCRIPTION("Advanced Linux Sound Architecture IWFFFF support.");
 MODULE_LICENSE("GPL");
 
index ac717bef9d7788b8473fe2a47af8ba17cf038402..78f68bee24fe76cc737a83d199d6062cddfb6254 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *   Simple (MOD player) - Instrument routines
- *   Copyright (c) 1999 by Jaroslav Kysela <perex@suse.cz>
+ *   Copyright (c) 1999 by Jaroslav Kysela <perex@perex.cz>
  *
  *   This program is free software; you can redistribute it and/or modify
  *   it under the terms of the GNU General Public License as published by
@@ -26,7 +26,7 @@
 #include <sound/initval.h>
 #include <asm/uaccess.h>
 
-MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>");
+MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>");
 MODULE_DESCRIPTION("Advanced Linux Sound Architecture Simple Instrument support.");
 MODULE_LICENSE("GPL");
 
index a37ddedf710795d38693f52436bff4f0f01b91af..b38406b8463ca95b5e2f844bef9cb1f672def92c 100644 (file)
@@ -1,6 +1,6 @@
 #
 # Makefile for ALSA
-# Copyright (c) 1999 by Jaroslav Kysela <perex@suse.cz>
+# Copyright (c) 1999 by Jaroslav Kysela <perex@perex.cz>
 #
 
 snd-seq-oss-objs  := seq_oss.o seq_oss_init.o seq_oss_timer.o seq_oss_ioctl.o \
index ca5a2ed4d7c3a669315c6dc926813e28d38306d8..d0d721c22eacca6d4379dab12f9fc4dd57238eaa 100644 (file)
@@ -176,29 +176,29 @@ snd_seq_oss_open(struct file *file, int level)
        int i, rc;
        struct seq_oss_devinfo *dp;
 
-       if ((dp = kzalloc(sizeof(*dp), GFP_KERNEL)) == NULL) {
+       dp = kzalloc(sizeof(*dp), GFP_KERNEL);
+       if (!dp) {
                snd_printk(KERN_ERR "can't malloc device info\n");
                return -ENOMEM;
        }
        debug_printk(("oss_open: dp = %p\n", dp));
 
+       dp->cseq = system_client;
+       dp->port = -1;
+       dp->queue = -1;
+
        for (i = 0; i < SNDRV_SEQ_OSS_MAX_CLIENTS; i++) {
                if (client_table[i] == NULL)
                        break;
        }
+
+       dp->index = i;
        if (i >= SNDRV_SEQ_OSS_MAX_CLIENTS) {
                snd_printk(KERN_ERR "too many applications\n");
-               kfree(dp);
-               return -ENOMEM;
+               rc = -ENOMEM;
+               goto _error;
        }
 
-       dp->index = i;
-       dp->cseq = system_client;
-       dp->port = -1;
-       dp->queue = -1;
-       dp->readq = NULL;
-       dp->writeq = NULL;
-
        /* look up synth and midi devices */
        snd_seq_oss_synth_setup(dp);
        snd_seq_oss_midi_setup(dp);
@@ -211,14 +211,16 @@ snd_seq_oss_open(struct file *file, int level)
 
        /* create port */
        debug_printk(("create new port\n"));
-       if ((rc = create_port(dp)) < 0) {
+       rc = create_port(dp);
+       if (rc < 0) {
                snd_printk(KERN_ERR "can't create port\n");
                goto _error;
        }
 
        /* allocate queue */
        debug_printk(("allocate queue\n"));
-       if ((rc = alloc_seq_queue(dp)) < 0)
+       rc = alloc_seq_queue(dp);
+       if (rc < 0)
                goto _error;
 
        /* set address */
@@ -235,7 +237,8 @@ snd_seq_oss_open(struct file *file, int level)
        /* initialize read queue */
        debug_printk(("initialize read queue\n"));
        if (is_read_mode(dp->file_mode)) {
-               if ((dp->readq = snd_seq_oss_readq_new(dp, maxqlen)) == NULL) {
+               dp->readq = snd_seq_oss_readq_new(dp, maxqlen);
+               if (!dp->readq) {
                        rc = -ENOMEM;
                        goto _error;
                }
@@ -245,7 +248,7 @@ snd_seq_oss_open(struct file *file, int level)
        debug_printk(("initialize write queue\n"));
        if (is_write_mode(dp->file_mode)) {
                dp->writeq = snd_seq_oss_writeq_new(dp, maxqlen);
-               if (dp->writeq == NULL) {
+               if (!dp->writeq) {
                        rc = -ENOMEM;
                        goto _error;
                }
@@ -253,7 +256,8 @@ snd_seq_oss_open(struct file *file, int level)
 
        /* initialize timer */
        debug_printk(("initialize timer\n"));
-       if ((dp->timer = snd_seq_oss_timer_new(dp)) == NULL) {
+       dp->timer = snd_seq_oss_timer_new(dp);
+       if (!dp->timer) {
                snd_printk(KERN_ERR "can't alloc timer\n");
                rc = -ENOMEM;
                goto _error;
@@ -276,11 +280,13 @@ snd_seq_oss_open(struct file *file, int level)
        return 0;
 
  _error:
+       snd_seq_oss_writeq_delete(dp->writeq);
+       snd_seq_oss_readq_delete(dp->readq);
        snd_seq_oss_synth_cleanup(dp);
        snd_seq_oss_midi_cleanup(dp);
-       i = dp->queue;
        delete_port(dp);
-       delete_seq_queue(i);
+       delete_seq_queue(dp->queue);
+       kfree(dp);
 
        return rc;
 }
index 5c8495601a38b49f89fc3c055728210f432e8178..217424858191e63bcd16b49e0f4d98c34192e6f5 100644 (file)
@@ -63,8 +63,10 @@ snd_seq_oss_writeq_new(struct seq_oss_devinfo *dp, int maxlen)
 void
 snd_seq_oss_writeq_delete(struct seq_oss_writeq *q)
 {
-       snd_seq_oss_writeq_clear(q);    /* to be sure */
-       kfree(q);
+       if (q) {
+               snd_seq_oss_writeq_clear(q);    /* to be sure */
+               kfree(q);
+       }
 }
 
 
index 2f0d8773ac6b6e6c04c8c4100c9d3435767378e2..1878208a802665a2b26b1233b3a31c497922a2c4 100644 (file)
@@ -53,7 +53,7 @@ int seq_default_timer_device =
 int seq_default_timer_subdevice = 0;
 int seq_default_timer_resolution = 0;  /* Hz */
 
-MODULE_AUTHOR("Frank van de Pol <fvdpol@coil.demon.nl>, Jaroslav Kysela <perex@suse.cz>");
+MODULE_AUTHOR("Frank van de Pol <fvdpol@coil.demon.nl>, Jaroslav Kysela <perex@perex.cz>");
 MODULE_DESCRIPTION("Advanced Linux Sound Architecture sequencer.");
 MODULE_LICENSE("GPL");
 
index b31b5282a2c84637b48224c6911f2822ee423717..2e3fa25ab19ffe8208ba17a1d06023bbf8d0427a 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *  ALSA sequencer Client Manager
  *  Copyright (c) 1998-2001 by Frank van de Pol <fvdpol@coil.demon.nl>
- *                             Jaroslav Kysela <perex@suse.cz>
+ *                             Jaroslav Kysela <perex@perex.cz>
  *                             Takashi Iwai <tiwai@suse.de>
  *
  *
index 5efe6523a589ee228456be47b63223e6febd0d00..9a6fd56c9109c7747d6962ed82fac218083d2744 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *   Generic Instrument routines for ALSA sequencer
- *   Copyright (c) 1999 by Jaroslav Kysela <perex@suse.cz>
+ *   Copyright (c) 1999 by Jaroslav Kysela <perex@perex.cz>
  *
  *   This program is free software; you can redistribute it and/or modify
  *   it under the terms of the GNU General Public License as published by
@@ -26,7 +26,7 @@
 #include <sound/seq_instr.h>
 #include <sound/initval.h>
 
-MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>");
+MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>");
 MODULE_DESCRIPTION("Advanced Linux Sound Architecture sequencer instrument library.");
 MODULE_LICENSE("GPL");
 
@@ -109,7 +109,7 @@ void snd_seq_instr_list_free(struct snd_seq_kinstr_list **list_ptr)
                        spin_lock_irqsave(&list->lock, flags);
                        while (instr->use) {
                                spin_unlock_irqrestore(&list->lock, flags);
-                               schedule_timeout(1);
+                               schedule_timeout_uninterruptible(1);
                                spin_lock_irqsave(&list->lock, flags);
                        }                               
                        spin_unlock_irqrestore(&list->lock, flags);
@@ -198,8 +198,10 @@ int snd_seq_instr_list_free_cond(struct snd_seq_kinstr_list *list,
                while (flist) {
                        instr = flist;
                        flist = instr->next;
-                       while (instr->use)
-                               schedule_timeout(1);
+                       while (instr->use) {
+                               schedule_timeout_uninterruptible(1);
+                               barrier();
+                       }
                        if (snd_seq_instr_free(instr, atomic)<0)
                                snd_printk(KERN_WARNING "instrument free problem\n");
                        instr = next;
@@ -555,7 +557,7 @@ static int instr_free(struct snd_seq_kinstr_ops *ops,
                                           SNDRV_SEQ_INSTR_NOTIFY_REMOVE);
                while (instr->use) {
                        spin_unlock_irqrestore(&list->lock, flags);
-                       schedule_timeout(1);
+                       schedule_timeout_uninterruptible(1);
                        spin_lock_irqsave(&list->lock, flags);
                }                               
                spin_unlock_irqrestore(&list->lock, flags);
index a3dc5e01e9f2cab6b17cf9602e876501a0d3ebeb..a72a1945bf8adb93e9590764c6994bb47632b742 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *  ALSA sequencer Memory Manager
  *  Copyright (c) 1998 by Frank van de Pol <fvdpol@coil.demon.nl>
- *                        Jaroslav Kysela <perex@suse.cz>
+ *                        Jaroslav Kysela <perex@perex.cz>
  *                2000 by Takashi Iwai <tiwai@suse.de>
  *
  *   This program is free software; you can redistribute it and/or modify
index 1daa5b069c798a06b9e87aeca80ded919b2c1f4c..5929aaf1df9d1f3340d509b2424bab4fb6cb50fa 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *   Generic MIDI synth driver for ALSA sequencer
  *   Copyright (c) 1998 by Frank van de Pol <fvdpol@coil.demon.nl>
- *                         Jaroslav Kysela <perex@suse.cz>
+ *                         Jaroslav Kysela <perex@perex.cz>
  *
  *   This program is free software; you can redistribute it and/or modify
  *   it under the terms of the GNU General Public License as published by
@@ -40,7 +40,7 @@ Possible options for midisynth module:
 #include <sound/seq_midi_event.h>
 #include <sound/initval.h>
 
-MODULE_AUTHOR("Frank van de Pol <fvdpol@coil.demon.nl>, Jaroslav Kysela <perex@suse.cz>");
+MODULE_AUTHOR("Frank van de Pol <fvdpol@coil.demon.nl>, Jaroslav Kysela <perex@perex.cz>");
 MODULE_DESCRIPTION("Advanced Linux Sound Architecture sequencer MIDI synth.");
 MODULE_LICENSE("GPL");
 static int output_buffer_size = PAGE_SIZE;
index 5ff80b776906cc32dd9fd3aea0bfd06a8b469806..b6820a5a73fc1518d0048c0d5f327331d7b45d4c 100644 (file)
@@ -2,7 +2,7 @@
  *  MIDI byte <-> sequencer event coder
  *
  *  Copyright (C) 1998,99 Takashi Iwai <tiwai@suse.de>,
- *                        Jaroslav Kysela <perex@suse.cz>
+ *                        Jaroslav Kysela <perex@perex.cz>
  *
  *   This program is free software; you can redistribute it and/or modify
  *   it under the terms of the GNU General Public License as published by
 #include <sound/seq_midi_event.h>
 #include <sound/asoundef.h>
 
-MODULE_AUTHOR("Takashi Iwai <tiwai@suse.de>, Jaroslav Kysela <perex@suse.cz>");
+MODULE_AUTHOR("Takashi Iwai <tiwai@suse.de>, Jaroslav Kysela <perex@perex.cz>");
 MODULE_DESCRIPTION("MIDI byte <-> sequencer event coder");
 MODULE_LICENSE("GPL");
 
-/* queue type */
-/* from 0 to 7 are normal commands (note off, on, etc.) */
-#define ST_NOTEOFF     0
-#define ST_NOTEON      1
+/* event type, index into status_event[] */
+/* from 0 to 6 are normal commands (note off, on, etc.) for 0x9?-0xe? */
+#define ST_INVALID     7
 #define ST_SPECIAL     8
 #define ST_SYSEX       ST_SPECIAL
 /* from 8 to 15 are events for 0xf0-0xf7 */
@@ -65,32 +64,33 @@ static struct status_event_list {
        void (*encode)(struct snd_midi_event *dev, struct snd_seq_event *ev);
        void (*decode)(struct snd_seq_event *ev, unsigned char *buf);
 } status_event[] = {
-       /* 0x80 - 0xf0 */
-       {SNDRV_SEQ_EVENT_NOTEOFF,       2, note_event, note_decode},
-       {SNDRV_SEQ_EVENT_NOTEON,        2, note_event, note_decode},
-       {SNDRV_SEQ_EVENT_KEYPRESS,      2, note_event, note_decode},
-       {SNDRV_SEQ_EVENT_CONTROLLER,    2, two_param_ctrl_event, two_param_decode},
-       {SNDRV_SEQ_EVENT_PGMCHANGE,     1, one_param_ctrl_event, one_param_decode},
-       {SNDRV_SEQ_EVENT_CHANPRESS,     1, one_param_ctrl_event, one_param_decode},
-       {SNDRV_SEQ_EVENT_PITCHBEND,     2, pitchbend_ctrl_event, pitchbend_decode},
-       {SNDRV_SEQ_EVENT_NONE,          0, NULL, NULL}, /* 0xf0 */
+       /* 0x80 - 0xef */
+       {SNDRV_SEQ_EVENT_NOTEOFF,        2, note_event, note_decode},
+       {SNDRV_SEQ_EVENT_NOTEON,         2, note_event, note_decode},
+       {SNDRV_SEQ_EVENT_KEYPRESS,       2, note_event, note_decode},
+       {SNDRV_SEQ_EVENT_CONTROLLER,     2, two_param_ctrl_event, two_param_decode},
+       {SNDRV_SEQ_EVENT_PGMCHANGE,      1, one_param_ctrl_event, one_param_decode},
+       {SNDRV_SEQ_EVENT_CHANPRESS,      1, one_param_ctrl_event, one_param_decode},
+       {SNDRV_SEQ_EVENT_PITCHBEND,      2, pitchbend_ctrl_event, pitchbend_decode},
+       /* invalid */
+       {SNDRV_SEQ_EVENT_NONE,          -1, NULL, NULL},
        /* 0xf0 - 0xff */
-       {SNDRV_SEQ_EVENT_SYSEX,         1, NULL, NULL}, /* sysex: 0xf0 */
-       {SNDRV_SEQ_EVENT_QFRAME,        1, one_param_event, one_param_decode}, /* 0xf1 */
-       {SNDRV_SEQ_EVENT_SONGPOS,       2, songpos_event, songpos_decode}, /* 0xf2 */
-       {SNDRV_SEQ_EVENT_SONGSEL,       1, one_param_event, one_param_decode}, /* 0xf3 */
-       {SNDRV_SEQ_EVENT_NONE,          0, NULL, NULL}, /* 0xf4 */
-       {SNDRV_SEQ_EVENT_NONE,          0, NULL, NULL}, /* 0xf5 */
-       {SNDRV_SEQ_EVENT_TUNE_REQUEST,  0, NULL, NULL}, /* 0xf6 */
-       {SNDRV_SEQ_EVENT_NONE,          0, NULL, NULL}, /* 0xf7 */
-       {SNDRV_SEQ_EVENT_CLOCK,         0, NULL, NULL}, /* 0xf8 */
-       {SNDRV_SEQ_EVENT_NONE,          0, NULL, NULL}, /* 0xf9 */
-       {SNDRV_SEQ_EVENT_START,         0, NULL, NULL}, /* 0xfa */
-       {SNDRV_SEQ_EVENT_CONTINUE,      0, NULL, NULL}, /* 0xfb */
-       {SNDRV_SEQ_EVENT_STOP,          0, NULL, NULL}, /* 0xfc */
-       {SNDRV_SEQ_EVENT_NONE,          0, NULL, NULL}, /* 0xfd */
-       {SNDRV_SEQ_EVENT_SENSING,       0, NULL, NULL}, /* 0xfe */
-       {SNDRV_SEQ_EVENT_RESET,         0, NULL, NULL}, /* 0xff */
+       {SNDRV_SEQ_EVENT_SYSEX,          1, NULL, NULL}, /* sysex: 0xf0 */
+       {SNDRV_SEQ_EVENT_QFRAME,         1, one_param_event, one_param_decode}, /* 0xf1 */
+       {SNDRV_SEQ_EVENT_SONGPOS,        2, songpos_event, songpos_decode}, /* 0xf2 */
+       {SNDRV_SEQ_EVENT_SONGSEL,        1, one_param_event, one_param_decode}, /* 0xf3 */
+       {SNDRV_SEQ_EVENT_NONE,          -1, NULL, NULL}, /* 0xf4 */
+       {SNDRV_SEQ_EVENT_NONE,          -1, NULL, NULL}, /* 0xf5 */
+       {SNDRV_SEQ_EVENT_TUNE_REQUEST,   0, NULL, NULL}, /* 0xf6 */
+       {SNDRV_SEQ_EVENT_NONE,          -1, NULL, NULL}, /* 0xf7 */
+       {SNDRV_SEQ_EVENT_CLOCK,          0, NULL, NULL}, /* 0xf8 */
+       {SNDRV_SEQ_EVENT_NONE,          -1, NULL, NULL}, /* 0xf9 */
+       {SNDRV_SEQ_EVENT_START,          0, NULL, NULL}, /* 0xfa */
+       {SNDRV_SEQ_EVENT_CONTINUE,       0, NULL, NULL}, /* 0xfb */
+       {SNDRV_SEQ_EVENT_STOP,           0, NULL, NULL}, /* 0xfc */
+       {SNDRV_SEQ_EVENT_NONE,          -1, NULL, NULL}, /* 0xfd */
+       {SNDRV_SEQ_EVENT_SENSING,        0, NULL, NULL}, /* 0xfe */
+       {SNDRV_SEQ_EVENT_RESET,          0, NULL, NULL}, /* 0xff */
 };
 
 static int extra_decode_ctrl14(struct snd_midi_event *dev, unsigned char *buf, int len,
@@ -129,6 +129,7 @@ int snd_midi_event_new(int bufsize, struct snd_midi_event **rdev)
        }
        dev->bufsize = bufsize;
        dev->lastcmd = 0xff;
+       dev->type = ST_INVALID;
        spin_lock_init(&dev->lock);
        *rdev = dev;
        return 0;
@@ -149,7 +150,7 @@ static inline void reset_encode(struct snd_midi_event *dev)
 {
        dev->read = 0;
        dev->qlen = 0;
-       dev->type = 0;
+       dev->type = ST_INVALID;
 }
 
 void snd_midi_event_reset_encode(struct snd_midi_event *dev)
@@ -251,29 +252,31 @@ int snd_midi_event_encode_byte(struct snd_midi_event *dev, int c,
                ev->type = status_event[ST_SPECIAL + c - 0xf0].event;
                ev->flags &= ~SNDRV_SEQ_EVENT_LENGTH_MASK;
                ev->flags |= SNDRV_SEQ_EVENT_LENGTH_FIXED;
-               return 1;
+               return ev->type != SNDRV_SEQ_EVENT_NONE;
        }
 
        spin_lock_irqsave(&dev->lock, flags);
-       if (dev->qlen > 0) {
-               /* rest of command */
-               dev->buf[dev->read++] = c;
-               if (dev->type != ST_SYSEX)
-                       dev->qlen--;
-       } else {
+       if ((c & 0x80) &&
+           (c != MIDI_CMD_COMMON_SYSEX_END || dev->type != ST_SYSEX)) {
                /* new command */
+               dev->buf[0] = c;
+               if ((c & 0xf0) == 0xf0) /* system messages */
+                       dev->type = (c & 0x0f) + ST_SPECIAL;
+               else
+                       dev->type = (c >> 4) & 0x07;
                dev->read = 1;
-               if (c & 0x80) {
-                       dev->buf[0] = c;
-                       if ((c & 0xf0) == 0xf0) /* special events */
-                               dev->type = (c & 0x0f) + ST_SPECIAL;
-                       else
-                               dev->type = (c >> 4) & 0x07;
-                       dev->qlen = status_event[dev->type].qlen;
-               } else {
-                       /* process this byte as argument */
+               dev->qlen = status_event[dev->type].qlen;
+       } else {
+               if (dev->qlen > 0) {
+                       /* rest of command */
                        dev->buf[dev->read++] = c;
+                       if (dev->type != ST_SYSEX)
+                               dev->qlen--;
+               } else {
+                       /* running status */
+                       dev->buf[1] = c;
                        dev->qlen = status_event[dev->type].qlen - 1;
+                       dev->read = 2;
                }
        }
        if (dev->qlen == 0) {
@@ -282,6 +285,8 @@ int snd_midi_event_encode_byte(struct snd_midi_event *dev, int c,
                ev->flags |= SNDRV_SEQ_EVENT_LENGTH_FIXED;
                if (status_event[dev->type].encode) /* set data values */
                        status_event[dev->type].encode(dev, ev);
+               if (dev->type >= ST_SPECIAL)
+                       dev->type = ST_INVALID;
                rc = 1;
        } else  if (dev->type == ST_SYSEX) {
                if (c == MIDI_CMD_COMMON_SYSEX_END ||
index eefd1cf872b49efac2f67d35831cc54b061d0163..b6e23ad12ab9bd2d94a0f72ca58a2eba74a9d199 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *   ALSA sequencer Ports
  *   Copyright (c) 1998 by Frank van de Pol <fvdpol@coil.demon.nl>
- *                         Jaroslav Kysela <perex@suse.cz>
+ *                         Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
index b4b9a132cb165ef35f0d656d5a00525c555d77f0..8716352afc812a8eb9dee2469d2e6c3fd1f30433 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *   ALSA sequencer Timer
  *   Copyright (c) 1998-1999 by Frank van de Pol <fvdpol@coil.demon.nl>
- *                              Jaroslav Kysela <perex@suse.cz>
+ *                              Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
index 8dc7a3b32b98482bc12f1b60aa6cb25352d41bf3..7b486c4d70db7c9c21d19a416b6a8db017b5ceb9 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Advanced Linux Sound Architecture
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
@@ -42,7 +42,7 @@ EXPORT_SYMBOL(snd_major);
 
 static int cards_limit = 1;
 
-MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>");
+MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>");
 MODULE_DESCRIPTION("Advanced Linux Sound Architecture driver for soundcards.");
 MODULE_LICENSE("GPL");
 module_param(major, int, 0444);
@@ -266,6 +266,14 @@ int snd_register_device_for_dev(int type, struct snd_card *card, int dev,
        snd_minors[minor] = preg;
        preg->dev = device_create(sound_class, device, MKDEV(major, minor),
                                  "%s", name);
+       if (IS_ERR(preg->dev)) {
+               snd_minors[minor] = NULL;
+               mutex_unlock(&sound_mutex);
+               minor = PTR_ERR(preg->dev);
+               kfree(preg);
+               return minor;
+       }
+
        if (preg->dev)
                dev_set_drvdata(preg->dev, private_data);
 
index 4566df41912a9f15a900914bb4bbc627619edc20..dc73313b733a32915ac4d729e9df751c57490d4b 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Advanced Linux Sound Architecture
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
index f2bbacedd567eedb518c628e33fbdd8dd3691351..e7dc56ca4b97d6840f286fd1013f3cfde80731a1 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Timers abstract layer
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
@@ -44,7 +44,7 @@
 #endif
 
 static int timer_limit = DEFAULT_TIMER_LIMIT;
-MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>, Takashi Iwai <tiwai@suse.de>");
+MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>, Takashi Iwai <tiwai@suse.de>");
 MODULE_DESCRIPTION("ALSA timer interface");
 MODULE_LICENSE("GPL");
 module_param(timer_limit, int, 0444);
index 04112642611a86fd522d30768473499e68ddc064..80aeff5ccdea390fe7953264ffd0b55311acdd11 100644 (file)
@@ -1,6 +1,6 @@
 #
 # Makefile for ALSA
-# Copyright (c) 2001 by Jaroslav Kysela <perex@suse.cz>
+# Copyright (c) 2001 by Jaroslav Kysela <perex@perex.cz>
 #
 
 snd-dummy-objs := dummy.o
index 4360ae9de19c4ec96ed7449f2ac525aec92e36a1..e008f3c58eaca172c19b0284d9100780bc705575 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Dummy soundcard
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *
  *   This program is free software; you can redistribute it and/or modify
  *   it under the terms of the GNU General Public License as published by
@@ -34,7 +34,7 @@
 #include <sound/rawmidi.h>
 #include <sound/initval.h>
 
-MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>");
+MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>");
 MODULE_DESCRIPTION("Dummy soundcard (/dev/null)");
 MODULE_LICENSE("GPL");
 MODULE_SUPPORTED_DEVICE("{{ALSA,Dummy soundcard}}");
@@ -510,15 +510,7 @@ static const DECLARE_TLV_DB_SCALE(db_scale_dummy, -4500, 30, 0);
   .get = snd_dummy_capsrc_get, .put = snd_dummy_capsrc_put, \
   .private_value = addr }
 
-static int snd_dummy_capsrc_info(struct snd_kcontrol *kcontrol,
-                                struct snd_ctl_elem_info *uinfo)
-{
-       uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
-       uinfo->count = 2;
-       uinfo->value.integer.min = 0;
-       uinfo->value.integer.max = 1;
-       return 0;
-}
+#define snd_dummy_capsrc_info  snd_ctl_boolean_stereo_info
  
 static int snd_dummy_capsrc_get(struct snd_kcontrol *kcontrol,
                                struct snd_ctl_elem_value *ucontrol)
index 3fe185d19ae54383c60c6ad42cd24c4bfbf1d745..918f83f34c11ab3cff3c82a7ef0c95b6c3b69eee 100644 (file)
@@ -1,6 +1,6 @@
 #
 # Makefile for ALSA
-# Copyright (c) 2001 by Jaroslav Kysela <perex@suse.cz>
+# Copyright (c) 2001 by Jaroslav Kysela <perex@perex.cz>
 #
 
 snd-mpu401-objs := mpu401.o
index 67c6e9745418b53748a9d67c21efdf7f603c54cf..1fc95dadde1d81d3502b03c48f7fe8f25fba47a6 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Driver for generic MPU-401 boards (UART mode only)
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *  Copyright (c) 2004 by Castet Matthieu <castet.matthieu@free.fr>
  *
  *
@@ -30,7 +30,7 @@
 #include <sound/mpu401.h>
 #include <sound/initval.h>
 
-MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>");
+MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>");
 MODULE_DESCRIPTION("MPU-401 UART");
 MODULE_LICENSE("GPL");
 
@@ -70,6 +70,9 @@ static int snd_mpu401_create(int dev, struct snd_card **rcard)
        struct snd_card *card;
        int err;
 
+       if (!uart_enter[dev])
+               snd_printk(KERN_ERR "the uart_enter option is obsolete; remove it\n");
+
        *rcard = NULL;
        card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0);
        if (card == NULL)
@@ -83,8 +86,7 @@ static int snd_mpu401_create(int dev, struct snd_card **rcard)
                strcat(card->longname, "polled");
        }
 
-       err = snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401, port[dev],
-                                 uart_enter[dev] ? 0 : MPU401_INFO_UART_ONLY,
+       err = snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401, port[dev], 0,
                                  irq[dev], irq[dev] >= 0 ? IRQF_DISABLED : 0,
           &nb