diff options
Diffstat (limited to 'ANDROID_3.4.5/sound/pci/au88x0')
24 files changed, 0 insertions, 8792 deletions
diff --git a/ANDROID_3.4.5/sound/pci/au88x0/Makefile b/ANDROID_3.4.5/sound/pci/au88x0/Makefile deleted file mode 100644 index d0a66bc5..00000000 --- a/ANDROID_3.4.5/sound/pci/au88x0/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -snd-au8810-objs := au8810.o -snd-au8820-objs := au8820.o -snd-au8830-objs := au8830.o - -obj-$(CONFIG_SND_AU8810) += snd-au8810.o -obj-$(CONFIG_SND_AU8820) += snd-au8820.o -obj-$(CONFIG_SND_AU8830) += snd-au8830.o diff --git a/ANDROID_3.4.5/sound/pci/au88x0/au8810.c b/ANDROID_3.4.5/sound/pci/au88x0/au8810.c deleted file mode 100644 index aa51cc77..00000000 --- a/ANDROID_3.4.5/sound/pci/au88x0/au8810.c +++ /dev/null @@ -1,16 +0,0 @@ -#include "au8810.h" -#include "au88x0.h" -static DEFINE_PCI_DEVICE_TABLE(snd_vortex_ids) = { - {PCI_VDEVICE(AUREAL, PCI_DEVICE_ID_AUREAL_ADVANTAGE), 1,}, - {0,} -}; - -#include "au88x0_core.c" -#include "au88x0_pcm.c" -#include "au88x0_mixer.c" -#include "au88x0_mpu401.c" -#include "au88x0_game.c" -#include "au88x0_eq.c" -#include "au88x0_a3d.c" -#include "au88x0_xtalk.c" -#include "au88x0.c" diff --git a/ANDROID_3.4.5/sound/pci/au88x0/au8810.h b/ANDROID_3.4.5/sound/pci/au88x0/au8810.h deleted file mode 100644 index 79fbee38..00000000 --- a/ANDROID_3.4.5/sound/pci/au88x0/au8810.h +++ /dev/null @@ -1,224 +0,0 @@ -/* - Aureal Advantage Soundcard driver. - */ - -#define CHIP_AU8810 - -#define CARD_NAME "Aureal Advantage" -#define CARD_NAME_SHORT "au8810" - -#define NR_ADB 0x10 -#define NR_WT 0x00 -#define NR_SRC 0x10 -#define NR_A3D 0x10 -#define NR_MIXIN 0x20 -#define NR_MIXOUT 0x10 - - -/* ADBDMA */ -#define VORTEX_ADBDMA_STAT 0x27e00 /* read only, subbuffer, DMA pos */ -#define POS_MASK 0x00000fff -#define POS_SHIFT 0x0 -#define ADB_SUBBUF_MASK 0x00003000 /* ADB only. */ -#define ADB_SUBBUF_SHIFT 0xc /* ADB only. */ -#define VORTEX_ADBDMA_CTRL 0x27180 /* write only; format, flags, DMA pos */ -#define OFFSET_MASK 0x00000fff -#define OFFSET_SHIFT 0x0 -#define IE_MASK 0x00001000 /* interrupt enable. */ -#define IE_SHIFT 0xc -#define DIR_MASK 0x00002000 /* Direction */ -#define DIR_SHIFT 0xd -#define FMT_MASK 0x0003c000 -#define FMT_SHIFT 0xe -// The ADB masks and shift also are valid for the wtdma, except if specified otherwise. -#define VORTEX_ADBDMA_BUFCFG0 0x27100 -#define VORTEX_ADBDMA_BUFCFG1 0x27104 -#define VORTEX_ADBDMA_BUFBASE 0x27000 -#define VORTEX_ADBDMA_START 0x27c00 /* Which subbuffer starts */ - -#define VORTEX_ADBDMA_STATUS 0x27A90 /* stored at AdbDma->this_10 / 2 DWORD in size. */ - -/* WTDMA */ -#define VORTEX_WTDMA_CTRL 0x27fd8 /* format, DMA pos */ -#define VORTEX_WTDMA_STAT 0x27fe8 /* DMA subbuf, DMA pos */ -#define WT_SUBBUF_MASK 0x3 -#define WT_SUBBUF_SHIFT 0xc -#define VORTEX_WTDMA_BUFBASE 0x27fc0 -#define VORTEX_WTDMA_BUFCFG0 0x27fd0 -#define VORTEX_WTDMA_BUFCFG1 0x27fd4 -#define VORTEX_WTDMA_START 0x27fe4 /* which subbuffer is first */ - -/* ADB */ -#define VORTEX_ADB_SR 0x28400 /* Samplerates enable/disable */ -#define VORTEX_ADB_RTBASE 0x28000 -#define VORTEX_ADB_RTBASE_COUNT 173 -#define VORTEX_ADB_CHNBASE 0x282b4 -#define VORTEX_ADB_CHNBASE_COUNT 24 -#define ROUTE_MASK 0xffff -#define SOURCE_MASK 0xff00 -#define ADB_MASK 0xff -#define ADB_SHIFT 0x8 - -/* ADB address */ -#define OFFSET_ADBDMA 0x00 -#define OFFSET_SRCIN 0x40 -#define OFFSET_SRCOUT 0x20 -#define OFFSET_MIXIN 0x50 -#define OFFSET_MIXOUT 0x30 -#define OFFSET_CODECIN 0x70 -#define OFFSET_CODECOUT 0x88 -#define OFFSET_SPORTIN 0x78 /* ch 0x13 */ -#define OFFSET_SPORTOUT 0x90 -#define OFFSET_SPDIFOUT 0x92 /* ch 0x14 check this! */ -#define OFFSET_EQIN 0xa0 -#define OFFSET_EQOUT 0x7e /* 2 routes on ch 0x11 */ -#define OFFSET_XTALKOUT 0x66 /* crosstalk canceller (source) */ -#define OFFSET_XTALKIN 0x96 /* crosstalk canceller (sink) */ -#define OFFSET_A3DIN 0x70 /* ADB sink. */ -#define OFFSET_A3DOUT 0xA6 /* ADB source. 2 routes per slice = 8 */ -#define OFFSET_EFXIN 0x80 /* ADB sink. */ -#define OFFSET_EFXOUT 0x68 /* ADB source. */ - -/* ADB route translate helper */ -#define ADB_DMA(x) (x) -#define ADB_SRCOUT(x) (x + OFFSET_SRCOUT) -#define ADB_SRCIN(x) (x + OFFSET_SRCIN) -#define ADB_MIXOUT(x) (x + OFFSET_MIXOUT) -#define ADB_MIXIN(x) (x + OFFSET_MIXIN) -#define ADB_CODECIN(x) (x + OFFSET_CODECIN) -#define ADB_CODECOUT(x) (x + OFFSET_CODECOUT) -#define ADB_SPORTIN(x) (x + OFFSET_SPORTIN) -#define ADB_SPORTOUT(x) (x + OFFSET_SPORTOUT) -#define ADB_SPDIFOUT(x) (x + OFFSET_SPDIFOUT) -#define ADB_EQIN(x) (x + OFFSET_EQIN) -#define ADB_EQOUT(x) (x + OFFSET_EQOUT) -#define ADB_A3DOUT(x) (x + OFFSET_A3DOUT) /* 0x10 A3D blocks */ -#define ADB_A3DIN(x) (x + OFFSET_A3DIN) -#define ADB_XTALKIN(x) (x + OFFSET_XTALKIN) -#define ADB_XTALKOUT(x) (x + OFFSET_XTALKOUT) - -#define MIX_OUTL 0xe -#define MIX_OUTR 0xf -#define MIX_INL 0x1e -#define MIX_INR 0x1f -#define MIX_DEFIGAIN 0x08 /* 0x8 => 6dB */ -#define MIX_DEFOGAIN 0x08 - -/* MIXER */ -#define VORTEX_MIXER_SR 0x21f00 -#define VORTEX_MIXER_CLIP 0x21f80 -#define VORTEX_MIXER_CHNBASE 0x21e40 -#define VORTEX_MIXER_RTBASE 0x21e00 -#define MIXER_RTBASE_SIZE 0x38 -#define VORTEX_MIX_ENIN 0x21a00 /* Input enable bits. 4 bits wide. */ -#define VORTEX_MIX_SMP 0x21c00 /* AU8820: 0x9c00 */ - -/* MIX */ -#define VORTEX_MIX_INVOL_A 0x21000 /* in? */ -#define VORTEX_MIX_INVOL_B 0x20000 /* out? */ -#define VORTEX_MIX_VOL_A 0x21800 -#define VORTEX_MIX_VOL_B 0x20800 - -#define VOL_MIN 0x80 /* Input volume when muted. */ -#define VOL_MAX 0x7f /* FIXME: Not confirmed! Just guessed. */ - -/* SRC */ -#define VORTEX_SRC_CHNBASE 0x26c40 -#define VORTEX_SRC_RTBASE 0x26c00 -#define VORTEX_SRCBLOCK_SR 0x26cc0 -#define VORTEX_SRC_SOURCE 0x26cc4 -#define VORTEX_SRC_SOURCESIZE 0x26cc8 -/* Params - 0x26e00 : 1 U0 - 0x26e40 : 2 CR - 0x26e80 : 3 U3 - 0x26ec0 : 4 DRIFT1 - 0x26f00 : 5 U1 - 0x26f40 : 6 DRIFT2 - 0x26f80 : 7 U2 : Target rate, direction -*/ - -#define VORTEX_SRC_CONVRATIO 0x26e40 -#define VORTEX_SRC_DRIFT0 0x26e80 -#define VORTEX_SRC_DRIFT1 0x26ec0 -#define VORTEX_SRC_DRIFT2 0x26f40 -#define VORTEX_SRC_U0 0x26e00 -#define U0_SLOWLOCK 0x200 -#define VORTEX_SRC_U1 0x26f00 -#define VORTEX_SRC_U2 0x26f80 -#define VORTEX_SRC_DATA 0x26800 /* 0xc800 */ -#define VORTEX_SRC_DATA0 0x26000 - -/* FIFO */ -#define VORTEX_FIFO_ADBCTRL 0x16100 /* Control bits. */ -#define VORTEX_FIFO_WTCTRL 0x16000 -#define FIFO_RDONLY 0x00000001 -#define FIFO_CTRL 0x00000002 /* Allow ctrl. ? */ -#define FIFO_VALID 0x00000010 -#define FIFO_EMPTY 0x00000020 -#define FIFO_U0 0x00001000 /* Unknown. */ -#define FIFO_U1 0x00010000 -#define FIFO_SIZE_BITS 5 -#define FIFO_SIZE (1<<FIFO_SIZE_BITS) // 0x20 -#define FIFO_MASK (FIFO_SIZE-1) //0x1f /* at shift left 0xc */ -//#define FIFO_MASK 0x1f /* at shift left 0xb */ -//#define FIFO_SIZE 0x20 -#define FIFO_BITS 0x03880000 -#define VORTEX_FIFO_ADBDATA 0x14000 -#define VORTEX_FIFO_WTDATA 0x10000 - -/* CODEC */ -#define VORTEX_CODEC_CTRL 0x29184 -#define VORTEX_CODEC_EN 0x29190 -#define EN_CODEC0 0x00000300 -#define EN_AC98 0x00000c00 /* Modem AC98 slots. */ -#define EN_CODEC1 0x00003000 -#define EN_CODEC (EN_CODEC0 | EN_CODEC1) -#define EN_SPORT 0x00030000 -#define EN_SPDIF 0x000c0000 - -#define VORTEX_CODEC_CHN 0x29080 -#define VORTEX_CODEC_IO 0x29188 - -/* SPDIF */ -#define VORTEX_SPDIF_FLAGS 0x2205c -#define VORTEX_SPDIF_CFG0 0x291D0 -#define VORTEX_SPDIF_CFG1 0x291D4 -#define VORTEX_SPDIF_SMPRATE 0x29194 - -/* Sample timer */ -#define VORTEX_SMP_TIME 0x29198 - -#define VORTEX_MODEM_CTRL 0x291ac - -/* IRQ */ -#define VORTEX_IRQ_SOURCE 0x2a000 /* Interrupt source flags. */ -#define VORTEX_IRQ_CTRL 0x2a004 /* Interrupt source mask. */ - -#define VORTEX_STAT 0x2a008 /* Status */ - -#define VORTEX_CTRL 0x2a00c -#define CTRL_MIDI_EN 0x00000001 -#define CTRL_MIDI_PORT 0x00000060 -#define CTRL_GAME_EN 0x00000008 -#define CTRL_GAME_PORT 0x00000e00 -//#define CTRL_IRQ_ENABLE 0x01004000 -#define CTRL_IRQ_ENABLE 0x00004000 - -/* write: Timer period config / read: TIMER IRQ ack. */ -#define VORTEX_IRQ_STAT 0x2919c - -/* DMA */ -#define VORTEX_ENGINE_CTRL 0x27ae8 -#define ENGINE_INIT 0x1380000 - -/* MIDI *//* GAME. */ -#define VORTEX_MIDI_DATA 0x28800 -#define VORTEX_MIDI_CMD 0x28804 /* Write command / Read status */ - -#define VORTEX_CTRL2 0x2880c -#define CTRL2_GAME_ADCMODE 0x40 -#define VORTEX_GAME_LEGACY 0x28808 -#define VORTEX_GAME_AXIS 0x28810 -#define AXIS_SIZE 4 -#define AXIS_RANGE 0x1fff diff --git a/ANDROID_3.4.5/sound/pci/au88x0/au8820.c b/ANDROID_3.4.5/sound/pci/au88x0/au8820.c deleted file mode 100644 index 2f321e73..00000000 --- a/ANDROID_3.4.5/sound/pci/au88x0/au8820.c +++ /dev/null @@ -1,14 +0,0 @@ -#include "au8820.h" -#include "au88x0.h" -static DEFINE_PCI_DEVICE_TABLE(snd_vortex_ids) = { - {PCI_VDEVICE(AUREAL, PCI_DEVICE_ID_AUREAL_VORTEX_1), 0,}, - {0,} -}; - -#include "au88x0_synth.c" -#include "au88x0_core.c" -#include "au88x0_pcm.c" -#include "au88x0_mpu401.c" -#include "au88x0_game.c" -#include "au88x0_mixer.c" -#include "au88x0.c" diff --git a/ANDROID_3.4.5/sound/pci/au88x0/au8820.h b/ANDROID_3.4.5/sound/pci/au88x0/au8820.h deleted file mode 100644 index cafdb966..00000000 --- a/ANDROID_3.4.5/sound/pci/au88x0/au8820.h +++ /dev/null @@ -1,204 +0,0 @@ -/* - Aureal Vortex Soundcard driver. - - IO addr collected from asp4core.vxd: - function address - 0005D5A0 13004 - 00080674 14004 - 00080AFF 12818 - - */ - -#define CHIP_AU8820 - -#define CARD_NAME "Aureal Vortex" -#define CARD_NAME_SHORT "au8820" - -/* Number of ADB and WT channels */ -#define NR_ADB 0x10 -#define NR_WT 0x20 -#define NR_SRC 0x10 -#define NR_A3D 0x00 -#define NR_MIXIN 0x10 -#define NR_MIXOUT 0x10 - - -/* ADBDMA */ -#define VORTEX_ADBDMA_STAT 0x105c0 /* read only, subbuffer, DMA pos */ -#define POS_MASK 0x00000fff -#define POS_SHIFT 0x0 -#define ADB_SUBBUF_MASK 0x00003000 /* ADB only. */ -#define ADB_SUBBUF_SHIFT 0xc /* ADB only. */ -#define VORTEX_ADBDMA_CTRL 0x10580 /* write only, format, flags, DMA pos */ -#define OFFSET_MASK 0x00000fff -#define OFFSET_SHIFT 0x0 -#define IE_MASK 0x00001000 /* interrupt enable. */ -#define IE_SHIFT 0xc -#define DIR_MASK 0x00002000 /* Direction. */ -#define DIR_SHIFT 0xd -#define FMT_MASK 0x0003c000 -#define FMT_SHIFT 0xe -// The masks and shift also work for the wtdma, if not specified otherwise. -#define VORTEX_ADBDMA_BUFCFG0 0x10400 -#define VORTEX_ADBDMA_BUFCFG1 0x10404 -#define VORTEX_ADBDMA_BUFBASE 0x10200 -#define VORTEX_ADBDMA_START 0x106c0 /* Which subbuffer starts */ -#define VORTEX_ADBDMA_STATUS 0x10600 /* stored at AdbDma->this_10 / 2 DWORD in size. */ - -/* ADB */ -#define VORTEX_ADB_SR 0x10a00 /* Samplerates enable/disable */ -#define VORTEX_ADB_RTBASE 0x10800 -#define VORTEX_ADB_RTBASE_COUNT 103 -#define VORTEX_ADB_CHNBASE 0x1099c -#define VORTEX_ADB_CHNBASE_COUNT 22 -#define ROUTE_MASK 0x3fff -#define ADB_MASK 0x7f -#define ADB_SHIFT 0x7 -//#define ADB_MIX_MASK 0xf -/* ADB address */ -#define OFFSET_ADBDMA 0x00 -#define OFFSET_SRCOUT 0x10 /* on channel 0x11 */ -#define OFFSET_SRCIN 0x10 /* on channel < 0x11 */ -#define OFFSET_MIXOUT 0x20 /* source */ -#define OFFSET_MIXIN 0x30 /* sink */ -#define OFFSET_CODECIN 0x48 /* ADB source */ -#define OFFSET_CODECOUT 0x58 /* ADB sink/target */ -#define OFFSET_SPORTOUT 0x60 /* sink */ -#define OFFSET_SPORTIN 0x50 /* source */ -#define OFFSET_EFXOUT 0x50 /* sink */ -#define OFFSET_EFXIN 0x40 /* source */ -#define OFFSET_A3DOUT 0x00 /* This card has no HRTF :( */ -#define OFFSET_A3DIN 0x00 -#define OFFSET_WTOUT 0x58 /* */ - -/* ADB route translate helper */ -#define ADB_DMA(x) (x + OFFSET_ADBDMA) -#define ADB_SRCOUT(x) (x + OFFSET_SRCOUT) -#define ADB_SRCIN(x) (x + OFFSET_SRCIN) -#define ADB_MIXOUT(x) (x + OFFSET_MIXOUT) -#define ADB_MIXIN(x) (x + OFFSET_MIXIN) -#define ADB_CODECIN(x) (x + OFFSET_CODECIN) -#define ADB_CODECOUT(x) (x + OFFSET_CODECOUT) -#define ADB_SPORTOUT(x) (x + OFFSET_SPORTOUT) -#define ADB_SPORTIN(x) (x + OFFSET_SPORTIN) /* */ -#define ADB_A3DOUT(x) (x + OFFSET_A3DOUT) /* 8 A3D blocks */ -#define ADB_A3DIN(x) (x + OFFSET_A3DIN) -#define ADB_WTOUT(x,y) (y + OFFSET_WTOUT) - -/* WTDMA */ -#define VORTEX_WTDMA_CTRL 0x10500 /* format, DMA pos */ -#define VORTEX_WTDMA_STAT 0x10500 /* DMA subbuf, DMA pos */ -#define WT_SUBBUF_MASK (0x3 << WT_SUBBUF_SHIFT) -#define WT_SUBBUF_SHIFT 0x15 -#define VORTEX_WTDMA_BUFBASE 0x10000 -#define VORTEX_WTDMA_BUFCFG0 0x10300 -#define VORTEX_WTDMA_BUFCFG1 0x10304 -#define VORTEX_WTDMA_START 0x10640 /* which subbuffer is first */ - -#define VORTEX_WT_BASE 0x9000 - -/* MIXER */ -#define VORTEX_MIXER_SR 0x9f00 -#define VORTEX_MIXER_CLIP 0x9f80 -#define VORTEX_MIXER_CHNBASE 0x9e40 -#define VORTEX_MIXER_RTBASE 0x9e00 -#define MIXER_RTBASE_SIZE 0x26 -#define VORTEX_MIX_ENIN 0x9a00 /* Input enable bits. 4 bits wide. */ -#define VORTEX_MIX_SMP 0x9c00 - -/* MIX */ -#define VORTEX_MIX_INVOL_A 0x9000 /* in? */ -#define VORTEX_MIX_INVOL_B 0x8000 /* out? */ -#define VORTEX_MIX_VOL_A 0x9800 -#define VORTEX_MIX_VOL_B 0x8800 - -#define VOL_MIN 0x80 /* Input volume when muted. */ -#define VOL_MAX 0x7f /* FIXME: Not confirmed! Just guessed. */ - -//#define MIX_OUTL 0xe -//#define MIX_OUTR 0xf -//#define MIX_INL 0xe -//#define MIX_INR 0xf -#define MIX_DEFIGAIN 0x08 /* 0x8 => 6dB */ -#define MIX_DEFOGAIN 0x08 - -/* SRC */ -#define VORTEX_SRCBLOCK_SR 0xccc0 -#define VORTEX_SRC_CHNBASE 0xcc40 -#define VORTEX_SRC_RTBASE 0xcc00 -#define VORTEX_SRC_SOURCE 0xccc4 -#define VORTEX_SRC_SOURCESIZE 0xccc8 -#define VORTEX_SRC_U0 0xce00 -#define VORTEX_SRC_DRIFT0 0xce80 -#define VORTEX_SRC_DRIFT1 0xcec0 -#define VORTEX_SRC_U1 0xcf00 -#define VORTEX_SRC_DRIFT2 0xcf40 -#define VORTEX_SRC_U2 0xcf80 -#define VORTEX_SRC_DATA 0xc800 -#define VORTEX_SRC_DATA0 0xc000 -#define VORTEX_SRC_CONVRATIO 0xce40 -//#define SRC_RATIO(x) ((((x<<15)/48000) + 1)/2) /* Playback */ -//#define SRC_RATIO2(x) ((((48000<<15)/x) + 1)/2) /* Recording */ - -/* FIFO */ -#define VORTEX_FIFO_ADBCTRL 0xf800 /* Control bits. */ -#define VORTEX_FIFO_WTCTRL 0xf840 -#define FIFO_RDONLY 0x00000001 -#define FIFO_CTRL 0x00000002 /* Allow ctrl. ? */ -#define FIFO_VALID 0x00000010 -#define FIFO_EMPTY 0x00000020 -#define FIFO_U0 0x00001000 /* Unknown. */ -#define FIFO_U1 0x00010000 -#define FIFO_SIZE_BITS 5 -#define FIFO_SIZE (1<<FIFO_SIZE_BITS) // 0x20 -#define FIFO_MASK (FIFO_SIZE-1) //0x1f /* at shift left 0xc */ -#define VORTEX_FIFO_ADBDATA 0xe000 -#define VORTEX_FIFO_WTDATA 0xe800 - -/* CODEC */ -#define VORTEX_CODEC_CTRL 0x11984 -#define VORTEX_CODEC_EN 0x11990 -#define EN_CODEC 0x00000300 -#define EN_SPORT 0x00030000 -#define EN_SPDIF 0x000c0000 -#define VORTEX_CODEC_CHN 0x11880 -#define VORTEX_CODEC_IO 0x11988 - -#define VORTEX_SPDIF_FLAGS 0x1005c /* FIXME */ -#define VORTEX_SPDIF_CFG0 0x119D0 -#define VORTEX_SPDIF_CFG1 0x119D4 -#define VORTEX_SPDIF_SMPRATE 0x11994 - -/* Sample timer */ -#define VORTEX_SMP_TIME 0x11998 - -/* IRQ */ -#define VORTEX_IRQ_SOURCE 0x12800 /* Interrupt source flags. */ -#define VORTEX_IRQ_CTRL 0x12804 /* Interrupt source mask. */ - -#define VORTEX_STAT 0x12808 /* ?? */ - -#define VORTEX_CTRL 0x1280c -#define CTRL_MIDI_EN 0x00000001 -#define CTRL_MIDI_PORT 0x00000060 -#define CTRL_GAME_EN 0x00000008 -#define CTRL_GAME_PORT 0x00000e00 -#define CTRL_IRQ_ENABLE 0x4000 - -/* write: Timer period config / read: TIMER IRQ ack. */ -#define VORTEX_IRQ_STAT 0x1199c - -/* DMA */ -#define VORTEX_DMA_BUFFER 0x10200 -#define VORTEX_ENGINE_CTRL 0x1060c -#define ENGINE_INIT 0x0L - - /* MIDI *//* GAME. */ -#define VORTEX_MIDI_DATA 0x11000 -#define VORTEX_MIDI_CMD 0x11004 /* Write command / Read status */ -#define VORTEX_GAME_LEGACY 0x11008 -#define VORTEX_CTRL2 0x1100c -#define CTRL2_GAME_ADCMODE 0x40 -#define VORTEX_GAME_AXIS 0x11010 -#define AXIS_SIZE 4 -#define AXIS_RANGE 0x1fff diff --git a/ANDROID_3.4.5/sound/pci/au88x0/au8830.c b/ANDROID_3.4.5/sound/pci/au88x0/au8830.c deleted file mode 100644 index 279b78f0..00000000 --- a/ANDROID_3.4.5/sound/pci/au88x0/au8830.c +++ /dev/null @@ -1,17 +0,0 @@ -#include "au8830.h" -#include "au88x0.h" -static DEFINE_PCI_DEVICE_TABLE(snd_vortex_ids) = { - {PCI_VDEVICE(AUREAL, PCI_DEVICE_ID_AUREAL_VORTEX_2), 0,}, - {0,} -}; - -#include "au88x0_synth.c" -#include "au88x0_core.c" -#include "au88x0_pcm.c" -#include "au88x0_mixer.c" -#include "au88x0_mpu401.c" -#include "au88x0_game.c" -#include "au88x0_eq.c" -#include "au88x0_a3d.c" -#include "au88x0_xtalk.c" -#include "au88x0.c" diff --git a/ANDROID_3.4.5/sound/pci/au88x0/au8830.h b/ANDROID_3.4.5/sound/pci/au88x0/au8830.h deleted file mode 100644 index 999b29ab..00000000 --- a/ANDROID_3.4.5/sound/pci/au88x0/au8830.h +++ /dev/null @@ -1,251 +0,0 @@ -/* - Aureal Vortex Soundcard driver. - - IO addr collected from asp4core.vxd: - function address - 0005D5A0 13004 - 00080674 14004 - 00080AFF 12818 - - */ - -#define CHIP_AU8830 - -#define CARD_NAME "Aureal Vortex 2" -#define CARD_NAME_SHORT "au8830" - -#define NR_ADB 0x20 -#define NR_SRC 0x10 -#define NR_A3D 0x10 -#define NR_MIXIN 0x20 -#define NR_MIXOUT 0x10 -#define NR_WT 0x40 - -/* ADBDMA */ -#define VORTEX_ADBDMA_STAT 0x27e00 /* read only, subbuffer, DMA pos */ -#define POS_MASK 0x00000fff -#define POS_SHIFT 0x0 -#define ADB_SUBBUF_MASK 0x00003000 /* ADB only. */ -#define ADB_SUBBUF_SHIFT 0xc /* ADB only. */ -#define VORTEX_ADBDMA_CTRL 0x27a00 /* write only; format, flags, DMA pos */ -#define OFFSET_MASK 0x00000fff -#define OFFSET_SHIFT 0x0 -#define IE_MASK 0x00001000 /* interrupt enable. */ -#define IE_SHIFT 0xc -#define DIR_MASK 0x00002000 /* Direction. */ -#define DIR_SHIFT 0xd -#define FMT_MASK 0x0003c000 -#define FMT_SHIFT 0xe -#define ADB_FIFO_EN_SHIFT 0x15 -#define ADB_FIFO_EN (1 << 0x15) -// The ADB masks and shift also are valid for the wtdma, except if specified otherwise. -#define VORTEX_ADBDMA_BUFCFG0 0x27800 -#define VORTEX_ADBDMA_BUFCFG1 0x27804 -#define VORTEX_ADBDMA_BUFBASE 0x27400 -#define VORTEX_ADBDMA_START 0x27c00 /* Which subbuffer starts */ - -#define VORTEX_ADBDMA_STATUS 0x27A90 /* stored at AdbDma->this_10 / 2 DWORD in size. */ -/* Starting at the MSB, each pair of bits seem to be the current DMA page. */ -/* This current page bits are consistent (same value) with VORTEX_ADBDMA_STAT) */ - -/* DMA */ -#define VORTEX_ENGINE_CTRL 0x27ae8 -#define ENGINE_INIT 0x1380000 - -/* WTDMA */ -#define VORTEX_WTDMA_CTRL 0x27900 /* format, DMA pos */ -#define VORTEX_WTDMA_STAT 0x27d00 /* DMA subbuf, DMA pos */ -#define WT_SUBBUF_MASK 0x3 -#define WT_SUBBUF_SHIFT 0xc -#define VORTEX_WTDMA_BUFBASE 0x27000 -#define VORTEX_WTDMA_BUFCFG0 0x27600 -#define VORTEX_WTDMA_BUFCFG1 0x27604 -#define VORTEX_WTDMA_START 0x27b00 /* which subbuffer is first */ - -/* ADB */ -#define VORTEX_ADB_SR 0x28400 /* Samplerates enable/disable */ -#define VORTEX_ADB_RTBASE 0x28000 -#define VORTEX_ADB_RTBASE_COUNT 173 -#define VORTEX_ADB_CHNBASE 0x282b4 -#define VORTEX_ADB_CHNBASE_COUNT 24 -#define ROUTE_MASK 0xffff -#define SOURCE_MASK 0xff00 -#define ADB_MASK 0xff -#define ADB_SHIFT 0x8 -/* ADB address */ -#define OFFSET_ADBDMA 0x00 -#define OFFSET_ADBDMAB 0x20 -#define OFFSET_SRCIN 0x40 -#define OFFSET_SRCOUT 0x20 /* ch 0x11 */ -#define OFFSET_MIXIN 0x50 /* ch 0x11 */ -#define OFFSET_MIXOUT 0x30 /* ch 0x11 */ -#define OFFSET_CODECIN 0x70 /* ch 0x11 */ /* adb source */ -#define OFFSET_CODECOUT 0x88 /* ch 0x11 */ /* adb target */ -#define OFFSET_SPORTIN 0x78 /* ch 0x13 ADB source. 2 routes. */ -#define OFFSET_SPORTOUT 0x90 /* ch 0x13 ADB sink. 2 routes. */ -#define OFFSET_SPDIFIN 0x7A /* ch 0x14 ADB source. */ -#define OFFSET_SPDIFOUT 0x92 /* ch 0x14 ADB sink. */ -#define OFFSET_AC98IN 0x7c /* ch 0x14 ADB source. */ -#define OFFSET_AC98OUT 0x94 /* ch 0x14 ADB sink. */ -#define OFFSET_EQIN 0xa0 /* ch 0x11 */ -#define OFFSET_EQOUT 0x7e /* ch 0x11 */ /* 2 routes on ch 0x11 */ -#define OFFSET_A3DIN 0x70 /* ADB sink. */ -#define OFFSET_A3DOUT 0xA6 /* ADB source. 2 routes per slice = 8 */ -#define OFFSET_WT0 0x40 /* WT bank 0 output. 0x40 - 0x65 */ -#define OFFSET_WT1 0x80 /* WT bank 1 output. 0x80 - 0xA5 */ -/* WT sources offset : 0x00-0x1f Direct stream. */ -/* WT sources offset : 0x20-0x25 Mixed Output. */ -#define OFFSET_XTALKOUT 0x66 /* crosstalk canceller (source) 2 routes */ -#define OFFSET_XTALKIN 0x96 /* crosstalk canceller (sink). 10 routes */ -#define OFFSET_EFXOUT 0x68 /* ADB source. 8 routes. */ -#define OFFSET_EFXIN 0x80 /* ADB sink. 8 routes. */ - -/* ADB route translate helper */ -#define ADB_DMA(x) (x) -#define ADB_SRCOUT(x) (x + OFFSET_SRCOUT) -#define ADB_SRCIN(x) (x + OFFSET_SRCIN) -#define ADB_MIXOUT(x) (x + OFFSET_MIXOUT) -#define ADB_MIXIN(x) (x + OFFSET_MIXIN) -#define ADB_CODECIN(x) (x + OFFSET_CODECIN) -#define ADB_CODECOUT(x) (x + OFFSET_CODECOUT) -#define ADB_SPORTIN(x) (x + OFFSET_SPORTIN) -#define ADB_SPORTOUT(x) (x + OFFSET_SPORTOUT) -#define ADB_SPDIFIN(x) (x + OFFSET_SPDIFIN) -#define ADB_SPDIFOUT(x) (x + OFFSET_SPDIFOUT) -#define ADB_EQIN(x) (x + OFFSET_EQIN) -#define ADB_EQOUT(x) (x + OFFSET_EQOUT) -#define ADB_A3DOUT(x) (x + OFFSET_A3DOUT) /* 0x10 A3D blocks */ -#define ADB_A3DIN(x) (x + OFFSET_A3DIN) -//#define ADB_WTOUT(x) ((x<x20)?(x + OFFSET_WT0):(x + OFFSET_WT1)) -#define ADB_WTOUT(x,y) (((x)==0)?((y) + OFFSET_WT0):((y) + OFFSET_WT1)) -#define ADB_XTALKIN(x) ((x) + OFFSET_XTALKIN) -#define ADB_XTALKOUT(x) ((x) + OFFSET_XTALKOUT) - -#define MIX_DEFIGAIN 0x08 -#define MIX_DEFOGAIN 0x08 /* 0x8->6dB (6dB = x4) 16 to 18 bit conversion? */ - -/* MIXER */ -#define VORTEX_MIXER_SR 0x21f00 -#define VORTEX_MIXER_CLIP 0x21f80 -#define VORTEX_MIXER_CHNBASE 0x21e40 -#define VORTEX_MIXER_RTBASE 0x21e00 -#define MIXER_RTBASE_SIZE 0x38 -#define VORTEX_MIX_ENIN 0x21a00 /* Input enable bits. 4 bits wide. */ -#define VORTEX_MIX_SMP 0x21c00 /* wave data buffers. AU8820: 0x9c00 */ - -/* MIX */ -#define VORTEX_MIX_INVOL_B 0x20000 /* Input volume current */ -#define VORTEX_MIX_VOL_B 0x20800 /* Output Volume current */ -#define VORTEX_MIX_INVOL_A 0x21000 /* Input Volume target */ -#define VORTEX_MIX_VOL_A 0x21800 /* Output Volume target */ - -#define VOL_MIN 0x80 /* Input volume when muted. */ -#define VOL_MAX 0x7f /* FIXME: Not confirmed! Just guessed. */ - -/* SRC */ -#define VORTEX_SRC_CHNBASE 0x26c40 -#define VORTEX_SRC_RTBASE 0x26c00 -#define VORTEX_SRCBLOCK_SR 0x26cc0 -#define VORTEX_SRC_SOURCE 0x26cc4 -#define VORTEX_SRC_SOURCESIZE 0x26cc8 -/* Params - 0x26e00 : 1 U0 - 0x26e40 : 2 CR - 0x26e80 : 3 U3 - 0x26ec0 : 4 DRIFT1 - 0x26f00 : 5 U1 - 0x26f40 : 6 DRIFT2 - 0x26f80 : 7 U2 : Target rate, direction -*/ - -#define VORTEX_SRC_CONVRATIO 0x26e40 -#define VORTEX_SRC_DRIFT0 0x26e80 -#define VORTEX_SRC_DRIFT1 0x26ec0 -#define VORTEX_SRC_DRIFT2 0x26f40 -#define VORTEX_SRC_U0 0x26e00 -#define U0_SLOWLOCK 0x200 -#define VORTEX_SRC_U1 0x26f00 -#define VORTEX_SRC_U2 0x26f80 -#define VORTEX_SRC_DATA 0x26800 /* 0xc800 */ -#define VORTEX_SRC_DATA0 0x26000 - -/* FIFO */ -#define VORTEX_FIFO_ADBCTRL 0x16100 /* Control bits. */ -#define VORTEX_FIFO_WTCTRL 0x16000 -#define FIFO_RDONLY 0x00000001 -#define FIFO_CTRL 0x00000002 /* Allow ctrl. ? */ -#define FIFO_VALID 0x00000010 -#define FIFO_EMPTY 0x00000020 -#define FIFO_U0 0x00002000 /* Unknown. */ -#define FIFO_U1 0x00040000 -#define FIFO_SIZE_BITS 6 -#define FIFO_SIZE (1<<(FIFO_SIZE_BITS)) // 0x40 -#define FIFO_MASK (FIFO_SIZE-1) //0x3f /* at shift left 0xc */ -#define FIFO_BITS 0x1c400000 -#define VORTEX_FIFO_ADBDATA 0x14000 -#define VORTEX_FIFO_WTDATA 0x10000 - -#define VORTEX_FIFO_GIRT 0x17000 /* wt0, wt1, adb */ -#define GIRT_COUNT 3 - -/* CODEC */ - -#define VORTEX_CODEC_CHN 0x29080 /* The name "CHN" is wrong. */ - -#define VORTEX_CODEC_CTRL 0x29184 -#define VORTEX_CODEC_IO 0x29188 - -#define VORTEX_CODEC_SPORTCTRL 0x2918c - -#define VORTEX_CODEC_EN 0x29190 -#define EN_AUDIO0 0x00000300 -#define EN_MODEM 0x00000c00 -#define EN_AUDIO1 0x00003000 -#define EN_SPORT 0x00030000 -#define EN_SPDIF 0x000c0000 -#define EN_CODEC (EN_AUDIO1 | EN_AUDIO0) - -#define VORTEX_SPDIF_SMPRATE 0x29194 - -#define VORTEX_SPDIF_FLAGS 0x2205c -#define VORTEX_SPDIF_CFG0 0x291D0 /* status data */ -#define VORTEX_SPDIF_CFG1 0x291D4 - -#define VORTEX_SMP_TIME 0x29198 /* Sample counter/timer */ -#define VORTEX_SMP_TIMER 0x2919c -#define VORTEX_CODEC2_CTRL 0x291a0 - -#define VORTEX_MODEM_CTRL 0x291ac - -/* IRQ */ -#define VORTEX_IRQ_SOURCE 0x2a000 /* Interrupt source flags. */ -#define VORTEX_IRQ_CTRL 0x2a004 /* Interrupt source mask. */ - -//#define VORTEX_IRQ_U0 0x2a008 /* ?? */ -#define VORTEX_STAT 0x2a008 /* Some sort of status */ -#define STAT_IRQ 0x00000001 /* This bitis set if the IRQ is valid. */ - -#define VORTEX_CTRL 0x2a00c -#define CTRL_MIDI_EN 0x00000001 -#define CTRL_MIDI_PORT 0x00000060 -#define CTRL_GAME_EN 0x00000008 -#define CTRL_GAME_PORT 0x00000e00 -#define CTRL_IRQ_ENABLE 0x00004000 -#define CTRL_SPDIF 0x00000000 /* unknown. Please find this value */ -#define CTRL_SPORT 0x00200000 -#define CTRL_RST 0x00800000 -#define CTRL_UNKNOWN 0x01000000 - -/* write: Timer period config / read: TIMER IRQ ack. */ -#define VORTEX_IRQ_STAT 0x2919c - - /* MIDI *//* GAME. */ -#define VORTEX_MIDI_DATA 0x28800 -#define VORTEX_MIDI_CMD 0x28804 /* Write command / Read status */ - -#define VORTEX_GAME_LEGACY 0x28808 -#define VORTEX_CTRL2 0x2880c -#define CTRL2_GAME_ADCMODE 0x40 -#define VORTEX_GAME_AXIS 0x28810 /* Axis base register. 4 axis's */ -#define AXIS_SIZE 4 -#define AXIS_RANGE 0x1fff diff --git a/ANDROID_3.4.5/sound/pci/au88x0/au88x0.c b/ANDROID_3.4.5/sound/pci/au88x0/au88x0.c deleted file mode 100644 index f13ad536..00000000 --- a/ANDROID_3.4.5/sound/pci/au88x0/au88x0.c +++ /dev/null @@ -1,398 +0,0 @@ -/* - * ALSA driver for the Aureal Vortex family of soundprocessors. - * Author: Manuel Jander (mjander@embedded.cl) - * - * This driver is the result of the OpenVortex Project from Savannah - * (savannah.nongnu.org/projects/openvortex). I would like to thank - * the developers of OpenVortex, Jeff Muizelaar and Kester Maddock, from - * whom i got plenty of help, and their codebase was invaluable. - * Thanks to the ALSA developers, they helped a lot working out - * the ALSA part. - * Thanks also to Sourceforge for maintaining the old binary drivers, - * and the forum, where developers could comunicate. - * - * Now at least i can play Legacy DOOM with MIDI music :-) - */ - -#include "au88x0.h" -#include <linux/init.h> -#include <linux/pci.h> -#include <linux/slab.h> -#include <linux/interrupt.h> -#include <linux/module.h> -#include <linux/dma-mapping.h> -#include <sound/initval.h> - -// module parameters (see "Module Parameters") -static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; -static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; -static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; -static int pcifix[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 255 }; - -module_param_array(index, int, NULL, 0444); -MODULE_PARM_DESC(index, "Index value for " CARD_NAME " soundcard."); -module_param_array(id, charp, NULL, 0444); -MODULE_PARM_DESC(id, "ID string for " CARD_NAME " soundcard."); -module_param_array(enable, bool, NULL, 0444); -MODULE_PARM_DESC(enable, "Enable " CARD_NAME " soundcard."); -module_param_array(pcifix, int, NULL, 0444); -MODULE_PARM_DESC(pcifix, "Enable VIA-workaround for " CARD_NAME " soundcard."); - -MODULE_DESCRIPTION("Aureal vortex"); -MODULE_LICENSE("GPL"); -MODULE_SUPPORTED_DEVICE("{{Aureal Semiconductor Inc., Aureal Vortex Sound Processor}}"); - -MODULE_DEVICE_TABLE(pci, snd_vortex_ids); - -static void vortex_fix_latency(struct pci_dev *vortex) -{ - int rc; - if (!(rc = pci_write_config_byte(vortex, 0x40, 0xff))) { - printk(KERN_INFO CARD_NAME - ": vortex latency is 0xff\n"); - } else { - printk(KERN_WARNING CARD_NAME - ": could not set vortex latency: pci error 0x%x\n", rc); - } -} - -static void vortex_fix_agp_bridge(struct pci_dev *via) -{ - int rc; - u8 value; - - /* - * only set the bit (Extend PCI#2 Internal Master for - * Efficient Handling of Dummy Requests) if the can - * read the config and it is not already set - */ - - if (!(rc = pci_read_config_byte(via, 0x42, &value)) - && ((value & 0x10) - || !(rc = pci_write_config_byte(via, 0x42, value | 0x10)))) { - printk(KERN_INFO CARD_NAME - ": bridge config is 0x%x\n", value | 0x10); - } else { - printk(KERN_WARNING CARD_NAME - ": could not set vortex latency: pci error 0x%x\n", rc); - } -} - -static void __devinit snd_vortex_workaround(struct pci_dev *vortex, int fix) -{ - struct pci_dev *via = NULL; - - /* autodetect if workarounds are required */ - if (fix == 255) { - /* VIA KT133 */ - via = pci_get_device(PCI_VENDOR_ID_VIA, - PCI_DEVICE_ID_VIA_8365_1, NULL); - /* VIA Apollo */ - if (via == NULL) { - via = pci_get_device(PCI_VENDOR_ID_VIA, - PCI_DEVICE_ID_VIA_82C598_1, NULL); - /* AMD Irongate */ - if (via == NULL) - via = pci_get_device(PCI_VENDOR_ID_AMD, - PCI_DEVICE_ID_AMD_FE_GATE_7007, NULL); - } - if (via) { - printk(KERN_INFO CARD_NAME ": Activating latency workaround...\n"); - vortex_fix_latency(vortex); - vortex_fix_agp_bridge(via); - } - } else { - if (fix & 0x1) - vortex_fix_latency(vortex); - if ((fix & 0x2) && (via = pci_get_device(PCI_VENDOR_ID_VIA, - PCI_DEVICE_ID_VIA_8365_1, NULL))) - vortex_fix_agp_bridge(via); - if ((fix & 0x4) && (via = pci_get_device(PCI_VENDOR_ID_VIA, - PCI_DEVICE_ID_VIA_82C598_1, NULL))) - vortex_fix_agp_bridge(via); - if ((fix & 0x8) && (via = pci_get_device(PCI_VENDOR_ID_AMD, - PCI_DEVICE_ID_AMD_FE_GATE_7007, NULL))) - vortex_fix_agp_bridge(via); - } - pci_dev_put(via); -} - -// component-destructor -// (see "Management of Cards and Components") -static int snd_vortex_dev_free(struct snd_device *device) -{ - vortex_t *vortex = device->device_data; - - vortex_gameport_unregister(vortex); - vortex_core_shutdown(vortex); - // Take down PCI interface. - free_irq(vortex->irq, vortex); - iounmap(vortex->mmio); - pci_release_regions(vortex->pci_dev); - pci_disable_device(vortex->pci_dev); - kfree(vortex); - - return 0; -} - -// chip-specific constructor -// (see "Management of Cards and Components") -static int __devinit -snd_vortex_create(struct snd_card *card, struct pci_dev *pci, vortex_t ** rchip) -{ - vortex_t *chip; - int err; - static struct snd_device_ops ops = { - .dev_free = snd_vortex_dev_free, - }; - - *rchip = NULL; - - // check PCI availability (DMA). - if ((err = pci_enable_device(pci)) < 0) - return err; - if (pci_set_dma_mask(pci, DMA_BIT_MASK(32)) < 0 || - pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(32)) < 0) { - printk(KERN_ERR "error to set DMA mask\n"); - pci_disable_device(pci); - return -ENXIO; - } - - chip = kzalloc(sizeof(*chip), GFP_KERNEL); - if (chip == NULL) { - pci_disable_device(pci); - return -ENOMEM; - } - - chip->card = card; - - // initialize the stuff - chip->pci_dev = pci; - chip->io = pci_resource_start(pci, 0); - chip->vendor = pci->vendor; - chip->device = pci->device; - chip->card = card; - chip->irq = -1; - - // (1) PCI resource allocation - // Get MMIO area - // - if ((err = pci_request_regions(pci, CARD_NAME_SHORT)) != 0) - goto regions_out; - - chip->mmio = pci_ioremap_bar(pci, 0); - if (!chip->mmio) { - printk(KERN_ERR "MMIO area remap failed.\n"); - err = -ENOMEM; - goto ioremap_out; - } - - /* Init audio core. - * This must be done before we do request_irq otherwise we can get spurious - * interrupts that we do not handle properly and make a mess of things */ - if ((err = vortex_core_init(chip)) != 0) { - printk(KERN_ERR "hw core init failed\n"); - goto core_out; - } - - if ((err = request_irq(pci->irq, vortex_interrupt, - IRQF_SHARED, KBUILD_MODNAME, - chip)) != 0) { - printk(KERN_ERR "cannot grab irq\n"); - goto irq_out; - } - chip->irq = pci->irq; - - pci_set_master(pci); - // End of PCI setup. - - // Register alsa root device. - if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) { - goto alloc_out; - } - - snd_card_set_dev(card, &pci->dev); - - *rchip = chip; - - return 0; - - alloc_out: - free_irq(chip->irq, chip); - irq_out: - vortex_core_shutdown(chip); - core_out: - iounmap(chip->mmio); - ioremap_out: - pci_release_regions(chip->pci_dev); - regions_out: - pci_disable_device(chip->pci_dev); - //FIXME: this not the right place to unregister the gameport - vortex_gameport_unregister(chip); - kfree(chip); - return err; -} - -// constructor -- see "Constructor" sub-section -static int __devinit -snd_vortex_probe(struct pci_dev *pci, const struct pci_device_id *pci_id) -{ - static int dev; - struct snd_card *card; - vortex_t *chip; - int err; - - // (1) - if (dev >= SNDRV_CARDS) - return -ENODEV; - if (!enable[dev]) { - dev++; - return -ENOENT; - } - // (2) - err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card); - if (err < 0) - return err; - - // (3) - if ((err = snd_vortex_create(card, pci, &chip)) < 0) { - snd_card_free(card); - return err; - } - snd_vortex_workaround(pci, pcifix[dev]); - - // Card details needed in snd_vortex_midi - strcpy(card->driver, CARD_NAME_SHORT); - sprintf(card->shortname, "Aureal Vortex %s", CARD_NAME_SHORT); - sprintf(card->longname, "%s at 0x%lx irq %i", - card->shortname, chip->io, chip->irq); - - // (4) Alloc components. - err = snd_vortex_mixer(chip); - if (err < 0) { - snd_card_free(card); - return err; - } - // ADB pcm. - err = snd_vortex_new_pcm(chip, VORTEX_PCM_ADB, NR_PCM); - if (err < 0) { - snd_card_free(card); - return err; - } -#ifndef CHIP_AU8820 - // ADB SPDIF - if ((err = snd_vortex_new_pcm(chip, VORTEX_PCM_SPDIF, 1)) < 0) { - snd_card_free(card); - return err; - } - // A3D - if ((err = snd_vortex_new_pcm(chip, VORTEX_PCM_A3D, NR_A3D)) < 0) { - snd_card_free(card); - return err; - } -#endif - /* - // ADB I2S - if ((err = snd_vortex_new_pcm(chip, VORTEX_PCM_I2S, 1)) < 0) { - snd_card_free(card); - return err; - } - */ -#ifndef CHIP_AU8810 - // WT pcm. - if ((err = snd_vortex_new_pcm(chip, VORTEX_PCM_WT, NR_WT)) < 0) { - snd_card_free(card); - return err; - } -#endif - if ((err = snd_vortex_midi(chip)) < 0) { - snd_card_free(card); - return err; - } - - vortex_gameport_register(chip); - -#if 0 - if (snd_seq_device_new(card, 1, SNDRV_SEQ_DEV_ID_VORTEX_SYNTH, - sizeof(snd_vortex_synth_arg_t), &wave) < 0 - || wave == NULL) { - snd_printk(KERN_ERR "Can't initialize Aureal wavetable synth\n"); - } else { - snd_vortex_synth_arg_t *arg; - - arg = SNDRV_SEQ_DEVICE_ARGPTR(wave); - strcpy(wave->name, "Aureal Synth"); - arg->hwptr = vortex; - arg->index = 1; - arg->seq_ports = seq_ports[dev]; - arg->max_voices = max_synth_voices[dev]; - } -#endif - - // (5) - if ((err = pci_read_config_word(pci, PCI_DEVICE_ID, - &(chip->device))) < 0) { - snd_card_free(card); - return err; - } - if ((err = pci_read_config_word(pci, PCI_VENDOR_ID, - &(chip->vendor))) < 0) { - snd_card_free(card); - return err; - } - chip->rev = pci->revision; -#ifdef CHIP_AU8830 - if ((chip->rev) != 0xfe && (chip->rev) != 0xfa) { - printk(KERN_ALERT - "vortex: The revision (%x) of your card has not been seen before.\n", - chip->rev); - printk(KERN_ALERT - "vortex: Please email the results of 'lspci -vv' to openvortex-dev@nongnu.org.\n"); - snd_card_free(card); - err = -ENODEV; - return err; - } -#endif - - // (6) - if ((err = snd_card_register(card)) < 0) { - snd_card_free(card); - return err; - } - // (7) - pci_set_drvdata(pci, card); - dev++; - vortex_connect_default(chip, 1); - vortex_enable_int(chip); - return 0; -} - -// destructor -- see "Destructor" sub-section -static void __devexit snd_vortex_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); - pci_set_drvdata(pci, NULL); -} - -// pci_driver definition -static struct pci_driver driver = { - .name = KBUILD_MODNAME, - .id_table = snd_vortex_ids, - .probe = snd_vortex_probe, - .remove = __devexit_p(snd_vortex_remove), -}; - -// initialization of the module -static int __init alsa_card_vortex_init(void) -{ - return pci_register_driver(&driver); -} - -// clean up the module -static void __exit alsa_card_vortex_exit(void) -{ - pci_unregister_driver(&driver); -} - -module_init(alsa_card_vortex_init) -module_exit(alsa_card_vortex_exit) diff --git a/ANDROID_3.4.5/sound/pci/au88x0/au88x0.h b/ANDROID_3.4.5/sound/pci/au88x0/au88x0.h deleted file mode 100644 index 466a5c8e..00000000 --- a/ANDROID_3.4.5/sound/pci/au88x0/au88x0.h +++ /dev/null @@ -1,295 +0,0 @@ -/* - * 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 Library 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_AU88X0_H -#define __SOUND_AU88X0_H - -#ifdef __KERNEL__ -#include <linux/pci.h> -#include <asm/io.h> -#include <sound/core.h> -#include <sound/pcm.h> -#include <sound/rawmidi.h> -#include <sound/mpu401.h> -#include <sound/hwdep.h> -#include <sound/ac97_codec.h> -#include <sound/tlv.h> -#endif - -#ifndef CHIP_AU8820 -#include "au88x0_eq.h" -#include "au88x0_a3d.h" -#endif -#ifndef CHIP_AU8810 -#include "au88x0_wt.h" -#endif - -#define hwread(x,y) readl((x)+(y)) -#define hwwrite(x,y,z) writel((z),(x)+(y)) - -/* Vortex MPU401 defines. */ -#define MIDI_CLOCK_DIV 0x61 -/* Standart MPU401 defines. */ -#define MPU401_RESET 0xff -#define MPU401_ENTER_UART 0x3f -#define MPU401_ACK 0xfe - -// Get src register value to convert from x to y. -#define SRC_RATIO(x,y) ((((x<<15)/y) + 1)/2) - -/* FIFO software state constants. */ -#define FIFO_STOP 0 -#define FIFO_START 1 -#define FIFO_PAUSE 2 - -/* IRQ flags */ -#define IRQ_ERR_MASK 0x00ff -#define IRQ_FATAL 0x0001 -#define IRQ_PARITY 0x0002 -#define IRQ_REG 0x0004 -#define IRQ_FIFO 0x0008 -#define IRQ_DMA 0x0010 -#define IRQ_PCMOUT 0x0020 /* PCM OUT page crossing */ -#define IRQ_TIMER 0x1000 -#define IRQ_MIDI 0x2000 -#define IRQ_MODEM 0x4000 - -/* ADB Resource */ -#define VORTEX_RESOURCE_DMA 0x00000000 -#define VORTEX_RESOURCE_SRC 0x00000001 -#define VORTEX_RESOURCE_MIXIN 0x00000002 -#define VORTEX_RESOURCE_MIXOUT 0x00000003 -#define VORTEX_RESOURCE_A3D 0x00000004 -#define VORTEX_RESOURCE_LAST 0x00000005 - -/* codec io: VORTEX_CODEC_IO bits */ -#define VORTEX_CODEC_ID_SHIFT 24 -#define VORTEX_CODEC_WRITE 0x00800000 -#define VORTEX_CODEC_ADDSHIFT 16 -#define VORTEX_CODEC_ADDMASK 0x7f0000 -#define VORTEX_CODEC_DATSHIFT 0 -#define VORTEX_CODEC_DATMASK 0xffff - -/* Check for SDAC bit in "Extended audio ID" AC97 register */ -//#define VORTEX_IS_QUAD(x) (((x)->codec == NULL) ? 0 : ((x)->codec->ext_id&0x80)) -#define VORTEX_IS_QUAD(x) ((x)->isquad) -/* Check if chip has bug. */ -#define IS_BAD_CHIP(x) (\ - (x->rev == 0xfe && x->device == PCI_DEVICE_ID_AUREAL_VORTEX_2) || \ - (x->rev == 0xfe && x->device == PCI_DEVICE_ID_AUREAL_ADVANTAGE)) - - -/* PCM devices */ -#define VORTEX_PCM_ADB 0 -#define VORTEX_PCM_SPDIF 1 -#define VORTEX_PCM_A3D 2 -#define VORTEX_PCM_WT 3 -#define VORTEX_PCM_I2S 4 -#define VORTEX_PCM_LAST 5 - -#define MIX_CAPT(x) (vortex->mixcapt[x]) -#define MIX_PLAYB(x) (vortex->mixplayb[x]) -#define MIX_SPDIF(x) (vortex->mixspdif[x]) - -#define NR_WTPB 0x20 /* WT channels per each bank. */ -#define NR_PCM 0x10 - -struct pcm_vol { - struct snd_kcontrol *kctl; - int active; - int dma; - int mixin[4]; - int vol[4]; -}; - -/* Structs */ -typedef struct { - //int this_08; /* Still unknown */ - int fifo_enabled; /* this_24 */ - int fifo_status; /* this_1c */ - u32 dma_ctrl; /* this_78 (ADB), this_7c (WT) */ - int dma_unknown; /* this_74 (ADB), this_78 (WT). WDM: +8 */ - int cfg0; - int cfg1; - - int nr_ch; /* Nr of PCM channels in use */ - int type; /* Output type (ac97, a3d, spdif, i2s, dsp) */ - int dma; /* Hardware DMA index. */ - int dir; /* Stream Direction. */ - u32 resources[5]; - - /* Virtual page extender stuff */ - int nr_periods; - int period_bytes; - int period_real; - int period_virt; - - struct snd_pcm_substream *substream; -} stream_t; - -typedef struct snd_vortex vortex_t; -struct snd_vortex { - /* ALSA structs. */ - struct snd_card *card; - struct snd_pcm *pcm[VORTEX_PCM_LAST]; - - struct snd_rawmidi *rmidi; /* Legacy Midi interface. */ - struct snd_ac97 *codec; - - /* Stream structs. */ - stream_t dma_adb[NR_ADB]; - int spdif_sr; -#ifndef CHIP_AU8810 - stream_t dma_wt[NR_WT]; - wt_voice_t wt_voice[NR_WT]; /* WT register cache. */ - char mixwt[(NR_WT / NR_WTPB) * 6]; /* WT mixin objects */ -#endif - - /* Global resources */ - s8 mixcapt[2]; - s8 mixplayb[4]; -#ifndef CHIP_AU8820 - s8 mixspdif[2]; - s8 mixa3d[2]; /* mixers which collect all a3d streams. */ - s8 mixxtlk[2]; /* crosstalk canceler mixer inputs. */ -#endif - u32 fixed_res[5]; - -#ifndef CHIP_AU8820 - /* Hardware equalizer structs */ - eqlzr_t eq; - /* A3D structs */ - a3dsrc_t a3d[NR_A3D]; - /* Xtalk canceler */ - int xt_mode; /* 1: speakers, 0:headphones. */ -#endif - struct pcm_vol pcm_vol[NR_PCM]; - - int isquad; /* cache of extended ID codec flag. */ - - /* Gameport stuff. */ - struct gameport *gameport; - - /* PCI hardware resources */ - unsigned long io; - void __iomem *mmio; - unsigned int irq; - spinlock_t lock; - - /* PCI device */ - struct pci_dev *pci_dev; - u16 vendor; - u16 device; - u8 rev; -}; - -/* Functions. */ - -/* SRC */ -static void vortex_adb_setsrc(vortex_t * vortex, int adbdma, - unsigned int cvrt, int dir); - -/* DMA Engines. */ -static void vortex_adbdma_setbuffers(vortex_t * vortex, int adbdma, - int size, int count); -static void vortex_adbdma_setmode(vortex_t * vortex, int adbdma, int ie, - int dir, int fmt, int d, - u32 offset); -static void vortex_adbdma_setstartbuffer(vortex_t * vortex, int adbdma, int sb); -#ifndef CHIP_AU8810 -static void vortex_wtdma_setbuffers(vortex_t * vortex, int wtdma, - int size, int count); -static void vortex_wtdma_setmode(vortex_t * vortex, int wtdma, int ie, int fmt, int d, /*int e, */ - u32 offset); -static void vortex_wtdma_setstartbuffer(vortex_t * vortex, int wtdma, int sb); -#endif - -static void vortex_adbdma_startfifo(vortex_t * vortex, int adbdma); -//static void vortex_adbdma_stopfifo(vortex_t *vortex, int adbdma); -static void vortex_adbdma_pausefifo(vortex_t * vortex, int adbdma); -static void vortex_adbdma_resumefifo(vortex_t * vortex, int adbdma); -static inline int vortex_adbdma_getlinearpos(vortex_t * vortex, int adbdma); -static void vortex_adbdma_resetup(vortex_t *vortex, int adbdma); - -#ifndef CHIP_AU8810 -static void vortex_wtdma_startfifo(vortex_t * vortex, int wtdma); -static void vortex_wtdma_stopfifo(vortex_t * vortex, int wtdma); -static void vortex_wtdma_pausefifo(vortex_t * vortex, int wtdma); -static void vortex_wtdma_resumefifo(vortex_t * vortex, int wtdma); -static inline int vortex_wtdma_getlinearpos(vortex_t * vortex, int wtdma); -#endif - -/* global stuff. */ -static void vortex_codec_init(vortex_t * vortex); -static void vortex_codec_write(struct snd_ac97 * codec, unsigned short addr, - unsigned short data); -static unsigned short vortex_codec_read(struct snd_ac97 * codec, unsigned short addr); -static void vortex_spdif_init(vortex_t * vortex, int spdif_sr, int spdif_mode); - -static int vortex_core_init(vortex_t * card); -static int vortex_core_shutdown(vortex_t * card); -static void vortex_enable_int(vortex_t * card); -static irqreturn_t vortex_interrupt(int irq, void *dev_id); -static int vortex_alsafmt_aspfmt(int alsafmt); - -/* Connection stuff. */ -static void vortex_connect_default(vortex_t * vortex, int en); -static int vortex_adb_allocroute(vortex_t * vortex, int dma, int nr_ch, - int dir, int type, int subdev); -static char vortex_adb_checkinout(vortex_t * vortex, int resmap[], int out, - int restype); -#ifndef CHIP_AU8810 -static int vortex_wt_allocroute(vortex_t * vortex, int dma, int nr_ch); -static void vortex_wt_connect(vortex_t * vortex, int en); -static void vortex_wt_init(vortex_t * vortex); -#endif - -static void vortex_route(vortex_t * vortex, int en, unsigned char channel, - unsigned char source, unsigned char dest); -#if 0 -static void vortex_routes(vortex_t * vortex, int en, unsigned char channel, - unsigned char source, unsigned char dest0, - unsigned char dest1); -#endif -static void vortex_connection_mixin_mix(vortex_t * vortex, int en, - unsigned char mixin, - unsigned char mix, int a); -static void vortex_mix_setinputvolumebyte(vortex_t * vortex, - unsigned char mix, int mixin, - unsigned char vol); -static void vortex_mix_setvolumebyte(vortex_t * vortex, unsigned char mix, - unsigned char vol); - -/* A3D functions. */ -#ifndef CHIP_AU8820 -static void vortex_Vort3D_enable(vortex_t * v); -static void vortex_Vort3D_disable(vortex_t * v); -static void vortex_Vort3D_connect(vortex_t * vortex, int en); -static void vortex_Vort3D_InitializeSource(a3dsrc_t * a, int en); -#endif - -/* Driver stuff. */ -static int vortex_gameport_register(vortex_t * card); -static void vortex_gameport_unregister(vortex_t * card); -#ifndef CHIP_AU8820 -static int vortex_eq_init(vortex_t * vortex); -static int vortex_eq_free(vortex_t * vortex); -#endif -/* ALSA stuff. */ -static int snd_vortex_new_pcm(vortex_t * vortex, int idx, int nr); -static int snd_vortex_mixer(vortex_t * vortex); -static int snd_vortex_midi(vortex_t * vortex); -#endif diff --git a/ANDROID_3.4.5/sound/pci/au88x0/au88x0_a3d.c b/ANDROID_3.4.5/sound/pci/au88x0/au88x0_a3d.c deleted file mode 100644 index 9ae8b3b1..00000000 --- a/ANDROID_3.4.5/sound/pci/au88x0/au88x0_a3d.c +++ /dev/null @@ -1,914 +0,0 @@ -/*************************************************************************** - * au88x0_a3d.c - * - * Fri Jul 18 14:16:22 2003 - * Copyright 2003 mjander - * mjander@users.sourceforge.net - * - * A3D. You may think i'm crazy, but this may work someday. Who knows... - ****************************************************************************/ - -/* - * 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 Library 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. - */ - -#include "au88x0_a3d.h" -#include "au88x0_a3ddata.c" -#include "au88x0_xtalk.h" -#include "au88x0.h" - -static void -a3dsrc_SetTimeConsts(a3dsrc_t * a, short HrtfTrack, short ItdTrack, - short GTrack, short CTrack) -{ - vortex_t *vortex = (vortex_t *) (a->vortex); - hwwrite(vortex->mmio, - a3d_addrA(a->slice, a->source, A3D_A_HrtfTrackTC), HrtfTrack); - hwwrite(vortex->mmio, - a3d_addrA(a->slice, a->source, A3D_A_ITDTrackTC), ItdTrack); - hwwrite(vortex->mmio, - a3d_addrA(a->slice, a->source, A3D_A_GainTrackTC), GTrack); - hwwrite(vortex->mmio, - a3d_addrA(a->slice, a->source, A3D_A_CoeffTrackTC), CTrack); -} - -#if 0 -static void -a3dsrc_GetTimeConsts(a3dsrc_t * a, short *HrtfTrack, short *ItdTrack, - short *GTrack, short *CTrack) -{ - // stub! -} - -#endif -/* Atmospheric absorption. */ - -static void -a3dsrc_SetAtmosTarget(a3dsrc_t * a, short aa, short b, short c, short d, - short e) -{ - vortex_t *vortex = (vortex_t *) (a->vortex); - hwwrite(vortex->mmio, - a3d_addrB(a->slice, a->source, A3D_B_A21Target), - (e << 0x10) | d); - hwwrite(vortex->mmio, - a3d_addrB(a->slice, a->source, A3D_B_B10Target), - (b << 0x10) | aa); - hwwrite(vortex->mmio, - a3d_addrB(a->slice, a->source, A3D_B_B2Target), c); -} - -static void -a3dsrc_SetAtmosCurrent(a3dsrc_t * a, short aa, short b, short c, short d, - short e) -{ - vortex_t *vortex = (vortex_t *) (a->vortex); - hwwrite(vortex->mmio, - a3d_addrB(a->slice, a->source, A3D_B_A12Current), - (e << 0x10) | d); - hwwrite(vortex->mmio, - a3d_addrB(a->slice, a->source, A3D_B_B01Current), - (b << 0x10) | aa); - hwwrite(vortex->mmio, - a3d_addrB(a->slice, a->source, A3D_B_B2Current), c); -} - -static void -a3dsrc_SetAtmosState(a3dsrc_t * a, short x1, short x2, short y1, short y2) -{ - vortex_t *vortex = (vortex_t *) (a->vortex); - hwwrite(vortex->mmio, a3d_addrA(a->slice, a->source, A3D_A_x1), x1); - hwwrite(vortex->mmio, a3d_addrA(a->slice, a->source, A3D_A_x2), x2); - hwwrite(vortex->mmio, a3d_addrA(a->slice, a->source, A3D_A_y1), y1); - hwwrite(vortex->mmio, a3d_addrA(a->slice, a->source, A3D_A_y2), y2); -} - -#if 0 -static void -a3dsrc_GetAtmosTarget(a3dsrc_t * a, short *aa, short *b, short *c, - short *d, short *e) -{ -} -static void -a3dsrc_GetAtmosCurrent(a3dsrc_t * a, short *bb01, short *ab01, short *b2, - short *aa12, short *ba12) -{ - vortex_t *vortex = (vortex_t *) (a->vortex); - *aa12 = - hwread(vortex->mmio, - a3d_addrA(a->slice, a->source, A3D_A_A12Current)); - *ba12 = - hwread(vortex->mmio, - a3d_addrB(a->slice, a->source, A3D_B_A12Current)); - *ab01 = - hwread(vortex->mmio, - a3d_addrA(a->slice, a->source, A3D_A_B01Current)); - *bb01 = - hwread(vortex->mmio, - a3d_addrB(a->slice, a->source, A3D_B_B01Current)); - *b2 = - hwread(vortex->mmio, - a3d_addrA(a->slice, a->source, A3D_A_B2Current)); -} - -static void -a3dsrc_GetAtmosState(a3dsrc_t * a, short *x1, short *x2, short *y1, short *y2) -{ - -} - -#endif -/* HRTF */ - -static void -a3dsrc_SetHrtfTarget(a3dsrc_t * a, a3d_Hrtf_t const aa, a3d_Hrtf_t const b) -{ - vortex_t *vortex = (vortex_t *) (a->vortex); - int i; - - for (i = 0; i < HRTF_SZ; i++) - hwwrite(vortex->mmio, - a3d_addrB(a->slice, a->source, - A3D_B_HrtfTarget) + (i << 2), - (b[i] << 0x10) | aa[i]); -} - -static void -a3dsrc_SetHrtfCurrent(a3dsrc_t * a, a3d_Hrtf_t const aa, a3d_Hrtf_t const b) -{ - vortex_t *vortex = (vortex_t *) (a->vortex); - int i; - - for (i = 0; i < HRTF_SZ; i++) - hwwrite(vortex->mmio, - a3d_addrB(a->slice, a->source, - A3D_B_HrtfCurrent) + (i << 2), - (b[i] << 0x10) | aa[i]); -} - -static void -a3dsrc_SetHrtfState(a3dsrc_t * a, a3d_Hrtf_t const aa, a3d_Hrtf_t const b) -{ - vortex_t *vortex = (vortex_t *) (a->vortex); - int i; - - for (i = 0; i < HRTF_SZ; i++) - hwwrite(vortex->mmio, - a3d_addrB(a->slice, a->source, - A3D_B_HrtfDelayLine) + (i << 2), - (b[i] << 0x10) | aa[i]); -} - -static void a3dsrc_SetHrtfOutput(a3dsrc_t * a, short left, short right) -{ - vortex_t *vortex = (vortex_t *) (a->vortex); - hwwrite(vortex->mmio, - a3d_addrA(a->slice, a->source, A3D_A_HrtfOutL), left); - hwwrite(vortex->mmio, - a3d_addrA(a->slice, a->source, A3D_A_HrtfOutR), right); -} - -#if 0 -static void a3dsrc_GetHrtfTarget(a3dsrc_t * a, a3d_Hrtf_t aa, a3d_Hrtf_t b) -{ - vortex_t *vortex = (vortex_t *) (a->vortex); - int i; - - for (i = 0; i < HRTF_SZ; i++) - aa[i] = - hwread(vortex->mmio, - a3d_addrA(a->slice, a->source, - A3D_A_HrtfTarget + (i << 2))); - for (i = 0; i < HRTF_SZ; i++) - b[i] = - hwread(vortex->mmio, - a3d_addrB(a->slice, a->source, - A3D_B_HrtfTarget + (i << 2))); -} - -static void a3dsrc_GetHrtfCurrent(a3dsrc_t * a, a3d_Hrtf_t aa, a3d_Hrtf_t b) -{ - vortex_t *vortex = (vortex_t *) (a->vortex); - int i; - - for (i = 0; i < HRTF_SZ; i++) - aa[i] = - hwread(vortex->mmio, - a3d_addrA(a->slice, a->source, - A3D_A_HrtfCurrent + (i << 2))); - for (i = 0; i < HRTF_SZ; i++) - b[i] = - hwread(vortex->mmio, - a3d_addrB(a->slice, a->source, - A3D_B_HrtfCurrent + (i << 2))); -} - -static void a3dsrc_GetHrtfState(a3dsrc_t * a, a3d_Hrtf_t aa, a3d_Hrtf_t b) -{ - vortex_t *vortex = (vortex_t *) (a->vortex); - int i; - // FIXME: verify this! - for (i = 0; i < HRTF_SZ; i++) - aa[i] = - hwread(vortex->mmio, - a3d_addrA(a->slice, a->source, - A3D_A_HrtfDelayLine + (i << 2))); - for (i = 0; i < HRTF_SZ; i++) - b[i] = - hwread(vortex->mmio, - a3d_addrB(a->slice, a->source, - A3D_B_HrtfDelayLine + (i << 2))); -} - -static void a3dsrc_GetHrtfOutput(a3dsrc_t * a, short *left, short *right) -{ - vortex_t *vortex = (vortex_t *) (a->vortex); - *left = - hwread(vortex->mmio, - a3d_addrA(a->slice, a->source, A3D_A_HrtfOutL)); - *right = - hwread(vortex->mmio, - a3d_addrA(a->slice, a->source, A3D_A_HrtfOutR)); -} - -#endif - -/* Interaural Time Difference. - * "The other main clue that humans use to locate sounds, is called - * Interaural Time Difference (ITD). The differences in distance from - * the sound source to a listeners ears means that the sound will - * reach one ear slightly before the other....", found somewhere with google.*/ -static void a3dsrc_SetItdTarget(a3dsrc_t * a, short litd, short ritd) -{ - vortex_t *vortex = (vortex_t *) (a->vortex); - - if (litd < 0) - litd = 0; - if (litd > 0x57FF) - litd = 0x57FF; - if (ritd < 0) - ritd = 0; - if (ritd > 0x57FF) - ritd = 0x57FF; - hwwrite(vortex->mmio, - a3d_addrB(a->slice, a->source, A3D_B_ITDTarget), - (ritd << 0x10) | litd); - //hwwrite(vortex->mmio, addr(0x191DF+5, this04, this08), (ritd<<0x10)|litd); -} - -static void a3dsrc_SetItdCurrent(a3dsrc_t * a, short litd, short ritd) -{ - vortex_t *vortex = (vortex_t *) (a->vortex); - - if (litd < 0) - litd = 0; - if (litd > 0x57FF) - litd = 0x57FF; - if (ritd < 0) - ritd = 0; - if (ritd > 0x57FF) - ritd = 0x57FF; - hwwrite(vortex->mmio, - a3d_addrB(a->slice, a->source, A3D_B_ITDCurrent), - (ritd << 0x10) | litd); - //hwwrite(vortex->mmio, addr(0x191DF+1, this04, this08), (ritd<<0x10)|litd); -} - -static void a3dsrc_SetItdDline(a3dsrc_t * a, a3d_ItdDline_t const dline) -{ - vortex_t *vortex = (vortex_t *) (a->vortex); - int i; - /* 45 != 40 -> Check this ! */ - for (i = 0; i < DLINE_SZ; i++) - hwwrite(vortex->mmio, - a3d_addrA(a->slice, a->source, - A3D_A_ITDDelayLine) + (i << 2), dline[i]); -} - -#if 0 -static void a3dsrc_GetItdTarget(a3dsrc_t * a, short *litd, short *ritd) -{ - vortex_t *vortex = (vortex_t *) (a->vortex); - *ritd = - hwread(vortex->mmio, - a3d_addrA(a->slice, a->source, A3D_A_ITDTarget)); - *litd = - hwread(vortex->mmio, - a3d_addrB(a->slice, a->source, A3D_B_ITDTarget)); -} - -static void a3dsrc_GetItdCurrent(a3dsrc_t * a, short *litd, short *ritd) -{ - vortex_t *vortex = (vortex_t *) (a->vortex); - - *ritd = - hwread(vortex->mmio, - a3d_addrA(a->slice, a->source, A3D_A_ITDCurrent)); - *litd = - hwread(vortex->mmio, - a3d_addrB(a->slice, a->source, A3D_B_ITDCurrent)); -} - -static void a3dsrc_GetItdDline(a3dsrc_t * a, a3d_ItdDline_t dline) -{ - vortex_t *vortex = (vortex_t *) (a->vortex); - int i; - - for (i = 0; i < DLINE_SZ; i++) - dline[i] = - hwread(vortex->mmio, - a3d_addrA(a->slice, a->source, - A3D_A_ITDDelayLine + (i << 2))); -} - -#endif -/* This is may be used for ILD Interaural Level Difference. */ - -static void a3dsrc_SetGainTarget(a3dsrc_t * a, short left, short right) -{ - vortex_t *vortex = (vortex_t *) (a->vortex); - hwwrite(vortex->mmio, - a3d_addrB(a->slice, a->source, A3D_B_GainTarget), - (right << 0x10) | left); -} - -static void a3dsrc_SetGainCurrent(a3dsrc_t * a, short left, short right) -{ - vortex_t *vortex = (vortex_t *) (a->vortex); - hwwrite(vortex->mmio, - a3d_addrB(a->slice, a->source, A3D_B_GainCurrent), - (right << 0x10) | left); -} - -#if 0 -static void a3dsrc_GetGainTarget(a3dsrc_t * a, short *left, short *right) -{ - vortex_t *vortex = (vortex_t *) (a->vortex); - *right = - hwread(vortex->mmio, - a3d_addrA(a->slice, a->source, A3D_A_GainTarget)); - *left = - hwread(vortex->mmio, - a3d_addrB(a->slice, a->source, A3D_B_GainTarget)); -} - -static void a3dsrc_GetGainCurrent(a3dsrc_t * a, short *left, short *right) -{ - vortex_t *vortex = (vortex_t *) (a->vortex); - *right = - hwread(vortex->mmio, - a3d_addrA(a->slice, a->source, A3D_A_GainCurrent)); - *left = - hwread(vortex->mmio, - a3d_addrB(a->slice, a->source, A3D_B_GainCurrent)); -} - -/* CA3dIO this func seems to be inlined all over this place. */ -static void CA3dIO_WriteReg(a3dsrc_t * a, unsigned long addr, short aa, short b) -{ - vortex_t *vortex = (vortex_t *) (a->vortex); - hwwrite(vortex->mmio, addr, (aa << 0x10) | b); -} - -#endif -/* Generic A3D stuff */ - -static void a3dsrc_SetA3DSampleRate(a3dsrc_t * a, int sr) -{ - vortex_t *vortex = (vortex_t *) (a->vortex); - int esp0 = 0; - - esp0 = (((esp0 & 0x7fffffff) | 0xB8000000) & 0x7) | ((sr & 0x1f) << 3); - hwwrite(vortex->mmio, A3D_SLICE_Control + ((a->slice) << 0xd), esp0); - //hwwrite(vortex->mmio, 0x19C38 + (this08<<0xd), esp0); -} - -static void a3dsrc_EnableA3D(a3dsrc_t * a) -{ - vortex_t *vortex = (vortex_t *) (a->vortex); - hwwrite(vortex->mmio, A3D_SLICE_Control + ((a->slice) << 0xd), - 0xF0000001); - //hwwrite(vortex->mmio, 0x19C38 + (this08<<0xd), 0xF0000001); -} - -static void a3dsrc_DisableA3D(a3dsrc_t * a) -{ - vortex_t *vortex = (vortex_t *) (a->vortex); - hwwrite(vortex->mmio, A3D_SLICE_Control + ((a->slice) << 0xd), - 0xF0000000); -} - -static void a3dsrc_SetA3DControlReg(a3dsrc_t * a, unsigned long ctrl) -{ - vortex_t *vortex = (vortex_t *) (a->vortex); - hwwrite(vortex->mmio, A3D_SLICE_Control + ((a->slice) << 0xd), ctrl); -} - -static void a3dsrc_SetA3DPointerReg(a3dsrc_t * a, unsigned long ptr) -{ - vortex_t *vortex = (vortex_t *) (a->vortex); - hwwrite(vortex->mmio, A3D_SLICE_Pointers + ((a->slice) << 0xd), ptr); -} - -#if 0 -static void a3dsrc_GetA3DSampleRate(a3dsrc_t * a, int *sr) -{ - vortex_t *vortex = (vortex_t *) (a->vortex); - *sr = ((hwread(vortex->mmio, A3D_SLICE_Control + (a->slice << 0xd)) - >> 3) & 0x1f); - //*sr = ((hwread(vortex->mmio, 0x19C38 + (this08<<0xd))>>3)&0x1f); -} - -static void a3dsrc_GetA3DControlReg(a3dsrc_t * a, unsigned long *ctrl) -{ - vortex_t *vortex = (vortex_t *) (a->vortex); - *ctrl = hwread(vortex->mmio, A3D_SLICE_Control + ((a->slice) << 0xd)); -} - -static void a3dsrc_GetA3DPointerReg(a3dsrc_t * a, unsigned long *ptr) -{ - vortex_t *vortex = (vortex_t *) (a->vortex); - *ptr = hwread(vortex->mmio, A3D_SLICE_Pointers + ((a->slice) << 0xd)); -} - -#endif -static void a3dsrc_ZeroSliceIO(a3dsrc_t * a) -{ - vortex_t *vortex = (vortex_t *) (a->vortex); - int i; - - for (i = 0; i < 8; i++) - hwwrite(vortex->mmio, - A3D_SLICE_VDBDest + - ((((a->slice) << 0xb) + i) << 2), 0); - for (i = 0; i < 4; i++) - hwwrite(vortex->mmio, - A3D_SLICE_VDBSource + - ((((a->slice) << 0xb) + i) << 2), 0); -} - -/* Reset Single A3D source. */ -static void a3dsrc_ZeroState(a3dsrc_t * a) -{ - /* - printk(KERN_DEBUG "vortex: ZeroState slice: %d, source %d\n", - a->slice, a->source); - */ - a3dsrc_SetAtmosState(a, 0, 0, 0, 0); - a3dsrc_SetHrtfState(a, A3dHrirZeros, A3dHrirZeros); - a3dsrc_SetItdDline(a, A3dItdDlineZeros); - a3dsrc_SetHrtfOutput(a, 0, 0); - a3dsrc_SetTimeConsts(a, 0, 0, 0, 0); - - a3dsrc_SetAtmosCurrent(a, 0, 0, 0, 0, 0); - a3dsrc_SetAtmosTarget(a, 0, 0, 0, 0, 0); - a3dsrc_SetItdCurrent(a, 0, 0); - a3dsrc_SetItdTarget(a, 0, 0); - a3dsrc_SetGainCurrent(a, 0, 0); - a3dsrc_SetGainTarget(a, 0, 0); - - a3dsrc_SetHrtfCurrent(a, A3dHrirZeros, A3dHrirZeros); - a3dsrc_SetHrtfTarget(a, A3dHrirZeros, A3dHrirZeros); -} - -/* Reset entire A3D engine */ -static void a3dsrc_ZeroStateA3D(a3dsrc_t * a) -{ - int i, var, var2; - - if ((a->vortex) == NULL) { - printk(KERN_ERR "vortex: ZeroStateA3D: ERROR: a->vortex is NULL\n"); - return; - } - - a3dsrc_SetA3DControlReg(a, 0); - a3dsrc_SetA3DPointerReg(a, 0); - - var = a->slice; - var2 = a->source; - for (i = 0; i < 4; i++) { - a->slice = i; - a3dsrc_ZeroSliceIO(a); - //a3dsrc_ZeroState(a); - } - a->source = var2; - a->slice = var; -} - -/* Program A3D block as pass through */ -static void a3dsrc_ProgramPipe(a3dsrc_t * a) -{ - a3dsrc_SetTimeConsts(a, 0, 0, 0, 0); - a3dsrc_SetAtmosCurrent(a, 0, 0x4000, 0, 0, 0); - a3dsrc_SetAtmosTarget(a, 0x4000, 0, 0, 0, 0); - a3dsrc_SetItdCurrent(a, 0, 0); - a3dsrc_SetItdTarget(a, 0, 0); - a3dsrc_SetGainCurrent(a, 0x7fff, 0x7fff); - a3dsrc_SetGainTarget(a, 0x7fff, 0x7fff); - - /* SET HRTF HERE */ - - /* Single spike leads to identity transfer function. */ - a3dsrc_SetHrtfCurrent(a, A3dHrirImpulse, A3dHrirImpulse); - a3dsrc_SetHrtfTarget(a, A3dHrirImpulse, A3dHrirImpulse); - - /* Test: Sounds saturated. */ - //a3dsrc_SetHrtfCurrent(a, A3dHrirSatTest, A3dHrirSatTest); - //a3dsrc_SetHrtfTarget(a, A3dHrirSatTest, A3dHrirSatTest); -} - -/* VDB = Vortex audio Dataflow Bus */ -#if 0 -static void a3dsrc_ClearVDBData(a3dsrc_t * a, unsigned long aa) -{ - vortex_t *vortex = (vortex_t *) (a->vortex); - - // ((aa >> 2) << 8) - (aa >> 2) - hwwrite(vortex->mmio, - a3d_addrS(a->slice, A3D_SLICE_VDBDest) + (a->source << 2), 0); - hwwrite(vortex->mmio, - a3d_addrS(a->slice, - A3D_SLICE_VDBDest + 4) + (a->source << 2), 0); - /* - hwwrite(vortex->mmio, 0x19c00 + (((aa>>2)*255*4)+aa)*8, 0); - hwwrite(vortex->mmio, 0x19c04 + (((aa>>2)*255*4)+aa)*8, 0); - */ -} -#endif - -/* A3D HwSource stuff. */ - -static void vortex_A3dSourceHw_Initialize(vortex_t * v, int source, int slice) -{ - a3dsrc_t *a3dsrc = &(v->a3d[source + (slice * 4)]); - //a3dsrc_t *a3dsrc = &(v->a3d[source + (slice*4)]); - - a3dsrc->vortex = (void *)v; - a3dsrc->source = source; /* source */ - a3dsrc->slice = slice; /* slice */ - a3dsrc_ZeroState(a3dsrc); - /* Added by me. */ - a3dsrc_SetA3DSampleRate(a3dsrc, 0x11); -} - -static int Vort3DRend_Initialize(vortex_t * v, unsigned short mode) -{ - v->xt_mode = mode; /* this_14 */ - - vortex_XtalkHw_init(v); - vortex_XtalkHw_SetGainsAllChan(v); - switch (v->xt_mode) { - case XT_SPEAKER0: - vortex_XtalkHw_ProgramXtalkNarrow(v); - break; - case XT_SPEAKER1: - vortex_XtalkHw_ProgramXtalkWide(v); - break; - default: - case XT_HEADPHONE: - vortex_XtalkHw_ProgramPipe(v); - break; - case XT_DIAMOND: - vortex_XtalkHw_ProgramDiamondXtalk(v); - break; - } - vortex_XtalkHw_SetSampleRate(v, 0x11); - vortex_XtalkHw_Enable(v); - return 0; -} - -/* 3D Sound entry points. */ - -static int vortex_a3d_register_controls(vortex_t * vortex); -static void vortex_a3d_unregister_controls(vortex_t * vortex); -/* A3D base support init/shudown */ -static void __devinit vortex_Vort3D_enable(vortex_t * v) -{ - int i; - - Vort3DRend_Initialize(v, XT_HEADPHONE); - for (i = 0; i < NR_A3D; i++) { - vortex_A3dSourceHw_Initialize(v, i % 4, i >> 2); - a3dsrc_ZeroStateA3D(&(v->a3d[0])); - } - /* Register ALSA controls */ - vortex_a3d_register_controls(v); -} - -static void vortex_Vort3D_disable(vortex_t * v) -{ - vortex_XtalkHw_Disable(v); - vortex_a3d_unregister_controls(v); -} - -/* Make A3D subsystem connections. */ -static void vortex_Vort3D_connect(vortex_t * v, int en) -{ - int i; - -// Disable AU8810 routes, since they seem to be wrong (in au8810.h). -#ifdef CHIP_AU8810 - return; -#endif - -#if 1 - /* Alloc Xtalk mixin resources */ - v->mixxtlk[0] = - vortex_adb_checkinout(v, v->fixed_res, en, VORTEX_RESOURCE_MIXIN); - if (v->mixxtlk[0] < 0) { - printk - ("vortex: vortex_Vort3D: ERROR: not enough free mixer resources.\n"); - return; - } - v->mixxtlk[1] = - vortex_adb_checkinout(v, v->fixed_res, en, VORTEX_RESOURCE_MIXIN); - if (v->mixxtlk[1] < 0) { - printk - ("vortex: vortex_Vort3D: ERROR: not enough free mixer resources.\n"); - return; - } -#endif - - /* Connect A3D -> XTALK */ - for (i = 0; i < 4; i++) { - // 2 outputs per each A3D slice. - vortex_route(v, en, 0x11, ADB_A3DOUT(i * 2), ADB_XTALKIN(i)); - vortex_route(v, en, 0x11, ADB_A3DOUT(i * 2) + 1, ADB_XTALKIN(5 + i)); - } -#if 0 - vortex_route(v, en, 0x11, ADB_XTALKOUT(0), ADB_EQIN(2)); - vortex_route(v, en, 0x11, ADB_XTALKOUT(1), ADB_EQIN(3)); -#else - /* Connect XTalk -> mixer */ - vortex_route(v, en, 0x11, ADB_XTALKOUT(0), ADB_MIXIN(v->mixxtlk[0])); - vortex_route(v, en, 0x11, ADB_XTALKOUT(1), ADB_MIXIN(v->mixxtlk[1])); - vortex_connection_mixin_mix(v, en, v->mixxtlk[0], v->mixplayb[0], 0); - vortex_connection_mixin_mix(v, en, v->mixxtlk[1], v->mixplayb[1], 0); - vortex_mix_setinputvolumebyte(v, v->mixplayb[0], v->mixxtlk[0], - en ? MIX_DEFIGAIN : VOL_MIN); - vortex_mix_setinputvolumebyte(v, v->mixplayb[1], v->mixxtlk[1], - en ? MIX_DEFIGAIN : VOL_MIN); - if (VORTEX_IS_QUAD(v)) { - vortex_connection_mixin_mix(v, en, v->mixxtlk[0], - v->mixplayb[2], 0); - vortex_connection_mixin_mix(v, en, v->mixxtlk[1], - v->mixplayb[3], 0); - vortex_mix_setinputvolumebyte(v, v->mixplayb[2], - v->mixxtlk[0], - en ? MIX_DEFIGAIN : VOL_MIN); - vortex_mix_setinputvolumebyte(v, v->mixplayb[3], - v->mixxtlk[1], - en ? MIX_DEFIGAIN : VOL_MIN); - } -#endif -} - -/* Initialize one single A3D source. */ -static void vortex_Vort3D_InitializeSource(a3dsrc_t * a, int en) -{ - if (a->vortex == NULL) { - printk - ("vortex: Vort3D_InitializeSource: A3D source not initialized\n"); - return; - } - if (en) { - a3dsrc_ProgramPipe(a); - a3dsrc_SetA3DSampleRate(a, 0x11); - a3dsrc_SetTimeConsts(a, HrtfTCDefault, - ItdTCDefault, GainTCDefault, - CoefTCDefault); - /* Remark: zero gain is muted. */ - //a3dsrc_SetGainTarget(a,0,0); - //a3dsrc_SetGainCurrent(a,0,0); - a3dsrc_EnableA3D(a); - } else { - a3dsrc_DisableA3D(a); - a3dsrc_ZeroState(a); - } -} - -/* Conversion of coordinates into 3D parameters. */ - -static void vortex_a3d_coord2hrtf(a3d_Hrtf_t hrtf, int *coord) -{ - /* FIXME: implement this. */ - -} -static void vortex_a3d_coord2itd(a3d_Itd_t itd, int *coord) -{ - /* FIXME: implement this. */ - -} -static void vortex_a3d_coord2ild(a3d_LRGains_t ild, int left, int right) -{ - /* FIXME: implement this. */ - -} -static void vortex_a3d_translate_filter(a3d_atmos_t filter, int *params) -{ - /* FIXME: implement this. */ - -} - -/* ALSA control interface. */ - -static int -snd_vortex_a3d_hrtf_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = 6; - uinfo->value.integer.min = 0x00000000; - uinfo->value.integer.max = 0xffffffff; - return 0; -} -static int -snd_vortex_a3d_itd_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = 2; - uinfo->value.integer.min = 0x00000000; - uinfo->value.integer.max = 0xffffffff; - return 0; -} -static int -snd_vortex_a3d_ild_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = 2; - uinfo->value.integer.min = 0x00000000; - uinfo->value.integer.max = 0xffffffff; - return 0; -} -static int -snd_vortex_a3d_filter_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = 4; - uinfo->value.integer.min = 0x00000000; - uinfo->value.integer.max = 0xffffffff; - return 0; -} - -static int -snd_vortex_a3d_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) -{ - //a3dsrc_t *a = kcontrol->private_data; - /* No read yet. Would this be really useable/needed ? */ - - return 0; -} - -static int -snd_vortex_a3d_hrtf_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - a3dsrc_t *a = kcontrol->private_data; - int changed = 1, i; - int coord[6]; - for (i = 0; i < 6; i++) - coord[i] = ucontrol->value.integer.value[i]; - /* Translate orientation coordinates to a3d params. */ - vortex_a3d_coord2hrtf(a->hrtf[0], coord); - vortex_a3d_coord2hrtf(a->hrtf[1], coord); - a3dsrc_SetHrtfTarget(a, a->hrtf[0], a->hrtf[1]); - a3dsrc_SetHrtfCurrent(a, a->hrtf[0], a->hrtf[1]); - return changed; -} - -static int -snd_vortex_a3d_itd_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - a3dsrc_t *a = kcontrol->private_data; - int coord[6]; - int i, changed = 1; - for (i = 0; i < 6; i++) - coord[i] = ucontrol->value.integer.value[i]; - /* Translate orientation coordinates to a3d params. */ - vortex_a3d_coord2itd(a->hrtf[0], coord); - vortex_a3d_coord2itd(a->hrtf[1], coord); - /* Inter aural time difference. */ - a3dsrc_SetItdTarget(a, a->itd[0], a->itd[1]); - a3dsrc_SetItdCurrent(a, a->itd[0], a->itd[1]); - a3dsrc_SetItdDline(a, a->dline); - return changed; -} - -static int -snd_vortex_a3d_ild_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - a3dsrc_t *a = kcontrol->private_data; - int changed = 1; - int l, r; - /* There may be some scale tranlation needed here. */ - l = ucontrol->value.integer.value[0]; - r = ucontrol->value.integer.value[1]; - vortex_a3d_coord2ild(a->ild, l, r); - /* Left Right panning. */ - a3dsrc_SetGainTarget(a, l, r); - a3dsrc_SetGainCurrent(a, l, r); - return changed; -} - -static int -snd_vortex_a3d_filter_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - a3dsrc_t *a = kcontrol->private_data; - int i, changed = 1; - int params[6]; - for (i = 0; i < 6; i++) - params[i] = ucontrol->value.integer.value[i]; - /* Translate generic filter params to a3d filter params. */ - vortex_a3d_translate_filter(a->filter, params); - /* Atmospheric absorption and filtering. */ - a3dsrc_SetAtmosTarget(a, a->filter[0], - a->filter[1], a->filter[2], - a->filter[3], a->filter[4]); - a3dsrc_SetAtmosCurrent(a, a->filter[0], - a->filter[1], a->filter[2], - a->filter[3], a->filter[4]); - return changed; -} - -static struct snd_kcontrol_new vortex_a3d_kcontrol __devinitdata = { - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = "Playback PCM advanced processing", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = snd_vortex_a3d_hrtf_info, - .get = snd_vortex_a3d_get, - .put = snd_vortex_a3d_hrtf_put, -}; - -/* Control (un)registration. */ -static int __devinit vortex_a3d_register_controls(vortex_t * vortex) -{ - struct snd_kcontrol *kcontrol; - int err, i; - /* HRTF controls. */ - for (i = 0; i < NR_A3D; i++) { - if ((kcontrol = - snd_ctl_new1(&vortex_a3d_kcontrol, &vortex->a3d[i])) == NULL) - return -ENOMEM; - kcontrol->id.numid = CTRLID_HRTF; - kcontrol->info = snd_vortex_a3d_hrtf_info; - kcontrol->put = snd_vortex_a3d_hrtf_put; - if ((err = snd_ctl_add(vortex->card, kcontrol)) < 0) - return err; - } - /* ITD controls. */ - for (i = 0; i < NR_A3D; i++) { - if ((kcontrol = - snd_ctl_new1(&vortex_a3d_kcontrol, &vortex->a3d[i])) == NULL) - return -ENOMEM; - kcontrol->id.numid = CTRLID_ITD; - kcontrol->info = snd_vortex_a3d_itd_info; - kcontrol->put = snd_vortex_a3d_itd_put; - if ((err = snd_ctl_add(vortex->card, kcontrol)) < 0) - return err; - } - /* ILD (gains) controls. */ - for (i = 0; i < NR_A3D; i++) { - if ((kcontrol = - snd_ctl_new1(&vortex_a3d_kcontrol, &vortex->a3d[i])) == NULL) - return -ENOMEM; - kcontrol->id.numid = CTRLID_GAINS; - kcontrol->info = snd_vortex_a3d_ild_info; - kcontrol->put = snd_vortex_a3d_ild_put; - if ((err = snd_ctl_add(vortex->card, kcontrol)) < 0) - return err; - } - /* Filter controls. */ - for (i = 0; i < NR_A3D; i++) { - if ((kcontrol = - snd_ctl_new1(&vortex_a3d_kcontrol, &vortex->a3d[i])) == NULL) - return -ENOMEM; - kcontrol->id.numid = CTRLID_FILTER; - kcontrol->info = snd_vortex_a3d_filter_info; - kcontrol->put = snd_vortex_a3d_filter_put; - if ((err = snd_ctl_add(vortex->card, kcontrol)) < 0) - return err; - } - return 0; -} - -static void vortex_a3d_unregister_controls(vortex_t * vortex) -{ - -} - -/* End of File*/ diff --git a/ANDROID_3.4.5/sound/pci/au88x0/au88x0_a3d.h b/ANDROID_3.4.5/sound/pci/au88x0/au88x0_a3d.h deleted file mode 100644 index 0584c65b..00000000 --- a/ANDROID_3.4.5/sound/pci/au88x0/au88x0_a3d.h +++ /dev/null @@ -1,123 +0,0 @@ -/*************************************************************************** - * au88x0_a3d.h - * - * Fri Jul 18 14:16:03 2003 - * Copyright 2003 mjander - * mjander@users.sourceforge.net - ****************************************************************************/ - -/* - * 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 Library 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 _AU88X0_A3D_H -#define _AU88X0_A3D_H - -//#include <openal.h> - -#define HRTF_SZ 0x38 -#define DLINE_SZ 0x28 - -#define CTRLID_HRTF 1 -#define CTRLID_ITD 2 -#define CTRLID_ILD 4 -#define CTRLID_FILTER 8 -#define CTRLID_GAINS 16 - -/* 3D parameter structs */ -typedef unsigned short int a3d_Hrtf_t[HRTF_SZ]; -typedef unsigned short int a3d_ItdDline_t[DLINE_SZ]; -typedef unsigned short int a3d_atmos_t[5]; -typedef unsigned short int a3d_LRGains_t[2]; -typedef unsigned short int a3d_Itd_t[2]; -typedef unsigned short int a3d_Ild_t[2]; - -typedef struct { - void *vortex; // Formerly CAsp4HwIO*, now vortex_t*. - unsigned int source; /* this_04 */ - unsigned int slice; /* this_08 */ - a3d_Hrtf_t hrtf[2]; - a3d_Itd_t itd; - a3d_Ild_t ild; - a3d_ItdDline_t dline; - a3d_atmos_t filter; -} a3dsrc_t; - -/* First Register bank */ - -#define A3D_A_HrtfCurrent 0x18000 /* 56 ULONG */ -#define A3D_A_GainCurrent 0x180E0 -#define A3D_A_GainTarget 0x180E4 -#define A3D_A_A12Current 0x180E8 /* Atmospheric current. */ -#define A3D_A_A21Target 0x180EC /* Atmospheric target */ -#define A3D_A_B01Current 0x180F0 /* Atmospheric current */ -#define A3D_A_B10Target 0x180F4 /* Atmospheric target */ -#define A3D_A_B2Current 0x180F8 /* Atmospheric current */ -#define A3D_A_B2Target 0x180FC /* Atmospheric target */ -#define A3D_A_HrtfTarget 0x18100 /* 56 ULONG */ -#define A3D_A_ITDCurrent 0x181E0 -#define A3D_A_ITDTarget 0x181E4 -#define A3D_A_HrtfDelayLine 0x181E8 /* 56 ULONG */ -#define A3D_A_ITDDelayLine 0x182C8 /* 40/45 ULONG */ -#define A3D_A_HrtfTrackTC 0x1837C /* Time Constants */ -#define A3D_A_GainTrackTC 0x18380 -#define A3D_A_CoeffTrackTC 0x18384 -#define A3D_A_ITDTrackTC 0x18388 -#define A3D_A_x1 0x1838C -#define A3D_A_x2 0x18390 -#define A3D_A_y1 0x18394 -#define A3D_A_y2 0x18398 -#define A3D_A_HrtfOutL 0x1839C -#define A3D_A_HrtfOutR 0x183A0 -#define A3D_A_TAIL 0x183A4 - -/* Second register bank */ -#define A3D_B_HrtfCurrent 0x19000 /* 56 ULONG */ -#define A3D_B_GainCurrent 0x190E0 -#define A3D_B_GainTarget 0x190E4 -#define A3D_B_A12Current 0x190E8 -#define A3D_B_A21Target 0x190EC -#define A3D_B_B01Current 0x190F0 -#define A3D_B_B10Target 0x190F4 -#define A3D_B_B2Current 0x190F8 -#define A3D_B_B2Target 0x190FC -#define A3D_B_HrtfTarget 0x19100 /* 56 ULONG */ -#define A3D_B_ITDCurrent 0x191E0 -#define A3D_B_ITDTarget 0x191E4 -#define A3D_B_HrtfDelayLine 0x191E8 /* 56 ULONG */ -#define A3D_B_TAIL 0x192C8 - -/* There are 4 slices, 4 a3d each = 16 a3d sources. */ -#define A3D_SLICE_BANK_A 0x18000 /* 4 sources */ -#define A3D_SLICE_BANK_B 0x19000 /* 4 sources */ -#define A3D_SLICE_VDBDest 0x19C00 /* 8 ULONG */ -#define A3D_SLICE_VDBSource 0x19C20 /* 4 ULONG */ -#define A3D_SLICE_ABReg 0x19C30 -#define A3D_SLICE_CReg 0x19C34 -#define A3D_SLICE_Control 0x19C38 -#define A3D_SLICE_DebugReserved 0x19C3c /* Dangerous! */ -#define A3D_SLICE_Pointers 0x19C40 -#define A3D_SLICE_TAIL 0x1A000 - -// Slice size: 0x2000 -// Source size: 0x3A4, 0x2C8 - -/* Address generator macro. */ -#define a3d_addrA(slice,source,reg) (((slice)<<0xd)+((source)*0x3A4)+(reg)) -#define a3d_addrB(slice,source,reg) (((slice)<<0xd)+((source)*0x2C8)+(reg)) -#define a3d_addrS(slice,reg) (((slice)<<0xd)+(reg)) -//#define a3d_addr(slice,source,reg) (((reg)>=0x19000) ? a3d_addr2((slice),(source),(reg)) : a3d_addr1((slice),(source),(reg))) - -#endif /* _AU88X0_A3D_H */ diff --git a/ANDROID_3.4.5/sound/pci/au88x0/au88x0_a3ddata.c b/ANDROID_3.4.5/sound/pci/au88x0/au88x0_a3ddata.c deleted file mode 100644 index 6fab4bba..00000000 --- a/ANDROID_3.4.5/sound/pci/au88x0/au88x0_a3ddata.c +++ /dev/null @@ -1,91 +0,0 @@ -/*************************************************************************** - * au88x0_a3ddata.c - * - * Wed Nov 19 21:11:32 2003 - * Copyright 2003 mjander - * mjander@users.sourceforge.org - ****************************************************************************/ - -/* - * 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 Library 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. - */ - -/* Constant initializer values. */ - -static const a3d_Hrtf_t A3dHrirZeros = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, - 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, - 0, 0, 0 -}; - -static const a3d_Hrtf_t A3dHrirImpulse = { - 0x7fff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, - 0, 0, 0 -}; - -static const a3d_Hrtf_t A3dHrirOnes = { - 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, - 0x7fff, - 0x7fff, - 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, - 0x7fff, - 0x7fff, - 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, - 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, - 0x7fff, - 0x7fff, - 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, - 0x7fff, - 0x7fff, - 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff -}; - -static const a3d_Hrtf_t A3dHrirSatTest = { - 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, - 0x7fff, - 0x7fff, - 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, - 0x8001, - 0x8001, - 0x7fff, 0x0000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; - -static const a3d_Hrtf_t A3dHrirDImpulse = { - 0, 0x7fff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, - 0, 0, 0 -}; - -static const a3d_ItdDline_t A3dItdDlineZeros = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; - -static short const GainTCDefault = 0x300; -static short const ItdTCDefault = 0x0C8; -static short const HrtfTCDefault = 0x147; -static short const CoefTCDefault = 0x300; diff --git a/ANDROID_3.4.5/sound/pci/au88x0/au88x0_core.c b/ANDROID_3.4.5/sound/pci/au88x0/au88x0_core.c deleted file mode 100644 index 525f881f..00000000 --- a/ANDROID_3.4.5/sound/pci/au88x0/au88x0_core.c +++ /dev/null @@ -1,2856 +0,0 @@ -/* - * 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 Library 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. - */ - -/* - Vortex core low level functions. - - Author: Manuel Jander (mjander@users.sourceforge.cl) - These functions are mainly the result of translations made - from the original disassembly of the au88x0 binary drivers, - written by Aureal before they went down. - Many thanks to the Jeff Muizelaar, Kester Maddock, and whoever - contributed to the OpenVortex project. - The author of this file, put the few available pieces together - and translated the rest of the riddle (Mix, Src and connection stuff). - Some things are still to be discovered, and their meanings are unclear. - - Some of these functions aren't intended to be really used, rather - to help to understand how does the AU88X0 chips work. Keep them in, because - they could be used somewhere in the future. - - This code hasn't been tested or proof read thoroughly. If you wanna help, - take a look at the AU88X0 assembly and check if this matches. - Functions tested ok so far are (they show the desired effect - at least): - vortex_routes(); (1 bug fixed). - vortex_adb_addroute(); - vortex_adb_addroutes(); - vortex_connect_codecplay(); - vortex_src_flushbuffers(); - vortex_adbdma_setmode(); note: still some unknown arguments! - vortex_adbdma_startfifo(); - vortex_adbdma_stopfifo(); - vortex_fifo_setadbctrl(); note: still some unknown arguments! - vortex_mix_setinputvolumebyte(); - vortex_mix_enableinput(); - vortex_mixer_addWTD(); (fixed) - vortex_connection_adbdma_src_src(); - vortex_connection_adbdma_src(); - vortex_src_change_convratio(); - vortex_src_addWTD(); (fixed) - - History: - - 01-03-2003 First revision. - 01-21-2003 Some bug fixes. - 17-02-2003 many bugfixes after a big versioning mess. - 18-02-2003 JAAAAAHHHUUUUUU!!!! The mixer works !! I'm just so happy ! - (2 hours later...) I cant believe it! Im really lucky today. - Now the SRC is working too! Yeah! XMMS works ! - 20-02-2003 First steps into the ALSA world. - 28-02-2003 As my birthday present, i discovered how the DMA buffer pages really - work :-). It was all wrong. - 12-03-2003 ALSA driver starts working (2 channels). - 16-03-2003 More srcblock_setupchannel discoveries. - 12-04-2003 AU8830 playback support. Recording in the works. - 17-04-2003 vortex_route() and vortex_routes() bug fixes. AU8830 recording - works now, but chipn' dale effect is still there. - 16-05-2003 SrcSetupChannel cleanup. Moved the Src setup stuff entirely - into au88x0_pcm.c . - 06-06-2003 Buffer shifter bugfix. Mixer volume fix. - 07-12-2003 A3D routing finally fixed. Believed to be OK. - 25-03-2004 Many thanks to Claudia, for such valuable bug reports. - -*/ - -#include "au88x0.h" -#include "au88x0_a3d.h" -#include <linux/delay.h> - -/* MIXER (CAsp4Mix.s and CAsp4Mixer.s) */ - -// FIXME: get rid of this. -static int mchannels[NR_MIXIN]; -static int rampchs[NR_MIXIN]; - -static void vortex_mixer_en_sr(vortex_t * vortex, int channel) -{ - hwwrite(vortex->mmio, VORTEX_MIXER_SR, - hwread(vortex->mmio, VORTEX_MIXER_SR) | (0x1 << channel)); -} -static void vortex_mixer_dis_sr(vortex_t * vortex, int channel) -{ - hwwrite(vortex->mmio, VORTEX_MIXER_SR, - hwread(vortex->mmio, VORTEX_MIXER_SR) & ~(0x1 << channel)); -} - -#if 0 -static void -vortex_mix_muteinputgain(vortex_t * vortex, unsigned char mix, - unsigned char channel) -{ - hwwrite(vortex->mmio, VORTEX_MIX_INVOL_A + ((mix << 5) + channel), - 0x80); - hwwrite(vortex->mmio, VORTEX_MIX_INVOL_B + ((mix << 5) + channel), - 0x80); -} - -static int vortex_mix_getvolume(vortex_t * vortex, unsigned char mix) -{ - int a; - a = hwread(vortex->mmio, VORTEX_MIX_VOL_A + (mix << 2)) & 0xff; - //FP2LinearFrac(a); - return (a); -} - -static int -vortex_mix_getinputvolume(vortex_t * vortex, unsigned char mix, - int channel, int *vol) -{ - int a; - if (!(mchannels[mix] & (1 << channel))) - return 0; - a = hwread(vortex->mmio, - VORTEX_MIX_INVOL_A + (((mix << 5) + channel) << 2)); - /* - if (rampchs[mix] == 0) - a = FP2LinearFrac(a); - else - a = FP2LinearFracWT(a); - */ - *vol = a; - return (0); -} - -static unsigned int vortex_mix_boost6db(unsigned char vol) -{ - return (vol + 8); /* WOW! what a complex function! */ -} - -static void vortex_mix_rampvolume(vortex_t * vortex, int mix) -{ - int ch; - char a; - // This function is intended for ramping down only (see vortex_disableinput()). - for (ch = 0; ch < 0x20; ch++) { - if (((1 << ch) & rampchs[mix]) == 0) - continue; - a = hwread(vortex->mmio, - VORTEX_MIX_INVOL_B + (((mix << 5) + ch) << 2)); - if (a > -126) { - a -= 2; - hwwrite(vortex->mmio, - VORTEX_MIX_INVOL_A + - (((mix << 5) + ch) << 2), a); - hwwrite(vortex->mmio, - VORTEX_MIX_INVOL_B + - (((mix << 5) + ch) << 2), a); - } else - vortex_mix_killinput(vortex, mix, ch); - } -} - -static int -vortex_mix_getenablebit(vortex_t * vortex, unsigned char mix, int mixin) -{ - int addr, temp; - if (mixin >= 0) - addr = mixin; - else - addr = mixin + 3; - addr = ((mix << 3) + (addr >> 2)) << 2; - temp = hwread(vortex->mmio, VORTEX_MIX_ENIN + addr); - return ((temp >> (mixin & 3)) & 1); -} -#endif -static void -vortex_mix_setvolumebyte(vortex_t * vortex, unsigned char mix, - unsigned char vol) -{ - int temp; - hwwrite(vortex->mmio, VORTEX_MIX_VOL_A + (mix << 2), vol); - if (1) { /*if (this_10) */ - temp = hwread(vortex->mmio, VORTEX_MIX_VOL_B + (mix << 2)); - if ((temp != 0x80) || (vol == 0x80)) - return; - } - hwwrite(vortex->mmio, VORTEX_MIX_VOL_B + (mix << 2), vol); -} - -static void -vortex_mix_setinputvolumebyte(vortex_t * vortex, unsigned char mix, - int mixin, unsigned char vol) -{ - int temp; - - hwwrite(vortex->mmio, - VORTEX_MIX_INVOL_A + (((mix << 5) + mixin) << 2), vol); - if (1) { /* this_10, initialized to 1. */ - temp = - hwread(vortex->mmio, - VORTEX_MIX_INVOL_B + (((mix << 5) + mixin) << 2)); - if ((temp != 0x80) || (vol == 0x80)) - return; - } - hwwrite(vortex->mmio, - VORTEX_MIX_INVOL_B + (((mix << 5) + mixin) << 2), vol); -} - -static void -vortex_mix_setenablebit(vortex_t * vortex, unsigned char mix, int mixin, int en) -{ - int temp, addr; - - if (mixin < 0) - addr = (mixin + 3); - else - addr = mixin; - addr = ((mix << 3) + (addr >> 2)) << 2; - temp = hwread(vortex->mmio, VORTEX_MIX_ENIN + addr); - if (en) - temp |= (1 << (mixin & 3)); - else - temp &= ~(1 << (mixin & 3)); - /* Mute input. Astatic void crackling? */ - hwwrite(vortex->mmio, - VORTEX_MIX_INVOL_B + (((mix << 5) + mixin) << 2), 0x80); - /* Looks like clear buffer. */ - hwwrite(vortex->mmio, VORTEX_MIX_SMP + (mixin << 2), 0x0); - hwwrite(vortex->mmio, VORTEX_MIX_SMP + 4 + (mixin << 2), 0x0); - /* Write enable bit. */ - hwwrite(vortex->mmio, VORTEX_MIX_ENIN + addr, temp); -} - -static void -vortex_mix_killinput(vortex_t * vortex, unsigned char mix, int mixin) -{ - rampchs[mix] &= ~(1 << mixin); - vortex_mix_setinputvolumebyte(vortex, mix, mixin, 0x80); - mchannels[mix] &= ~(1 << mixin); - vortex_mix_setenablebit(vortex, mix, mixin, 0); -} - -static void -vortex_mix_enableinput(vortex_t * vortex, unsigned char mix, int mixin) -{ - vortex_mix_killinput(vortex, mix, mixin); - if ((mchannels[mix] & (1 << mixin)) == 0) { - vortex_mix_setinputvolumebyte(vortex, mix, mixin, 0x80); /*0x80 : mute */ - mchannels[mix] |= (1 << mixin); - } - vortex_mix_setenablebit(vortex, mix, mixin, 1); -} - -static void -vortex_mix_disableinput(vortex_t * vortex, unsigned char mix, int channel, - int ramp) -{ - if (ramp) { - rampchs[mix] |= (1 << channel); - // Register callback. - //vortex_mix_startrampvolume(vortex); - vortex_mix_killinput(vortex, mix, channel); - } else - vortex_mix_killinput(vortex, mix, channel); -} - -static int -vortex_mixer_addWTD(vortex_t * vortex, unsigned char mix, unsigned char ch) -{ - int temp, lifeboat = 0, prev; - - temp = hwread(vortex->mmio, VORTEX_MIXER_SR); - if ((temp & (1 << ch)) == 0) { - hwwrite(vortex->mmio, VORTEX_MIXER_CHNBASE + (ch << 2), mix); - vortex_mixer_en_sr(vortex, ch); - return 1; - } - prev = VORTEX_MIXER_CHNBASE + (ch << 2); - temp = hwread(vortex->mmio, prev); - while (temp & 0x10) { - prev = VORTEX_MIXER_RTBASE + ((temp & 0xf) << 2); - temp = hwread(vortex->mmio, prev); - //printk(KERN_INFO "vortex: mixAddWTD: while addr=%x, val=%x\n", prev, temp); - if ((++lifeboat) > 0xf) { - printk(KERN_ERR - "vortex_mixer_addWTD: lifeboat overflow\n"); - return 0; - } - } - hwwrite(vortex->mmio, VORTEX_MIXER_RTBASE + ((temp & 0xf) << 2), mix); - hwwrite(vortex->mmio, prev, (temp & 0xf) | 0x10); - return 1; -} - -static int -vortex_mixer_delWTD(vortex_t * vortex, unsigned char mix, unsigned char ch) -{ - int esp14 = -1, esp18, eax, ebx, edx, ebp, esi = 0; - //int esp1f=edi(while)=src, esp10=ch; - - eax = hwread(vortex->mmio, VORTEX_MIXER_SR); - if (((1 << ch) & eax) == 0) { - printk(KERN_ERR "mix ALARM %x\n", eax); - return 0; - } - ebp = VORTEX_MIXER_CHNBASE + (ch << 2); - esp18 = hwread(vortex->mmio, ebp); - if (esp18 & 0x10) { - ebx = (esp18 & 0xf); - if (mix == ebx) { - ebx = VORTEX_MIXER_RTBASE + (mix << 2); - edx = hwread(vortex->mmio, ebx); - //7b60 - hwwrite(vortex->mmio, ebp, edx); - hwwrite(vortex->mmio, ebx, 0); - } else { - //7ad3 - edx = - hwread(vortex->mmio, - VORTEX_MIXER_RTBASE + (ebx << 2)); - //printk(KERN_INFO "vortex: mixdelWTD: 1 addr=%x, val=%x, src=%x\n", ebx, edx, src); - while ((edx & 0xf) != mix) { - if ((esi) > 0xf) { - printk(KERN_ERR - "vortex: mixdelWTD: error lifeboat overflow\n"); - return 0; - } - esp14 = ebx; - ebx = edx & 0xf; - ebp = ebx << 2; - edx = - hwread(vortex->mmio, - VORTEX_MIXER_RTBASE + ebp); - //printk(KERN_INFO "vortex: mixdelWTD: while addr=%x, val=%x\n", ebp, edx); - esi++; - } - //7b30 - ebp = ebx << 2; - if (edx & 0x10) { /* Delete entry in between others */ - ebx = VORTEX_MIXER_RTBASE + ((edx & 0xf) << 2); - edx = hwread(vortex->mmio, ebx); - //7b60 - hwwrite(vortex->mmio, - VORTEX_MIXER_RTBASE + ebp, edx); - hwwrite(vortex->mmio, ebx, 0); - //printk(KERN_INFO "vortex mixdelWTD between addr= 0x%x, val= 0x%x\n", ebp, edx); - } else { /* Delete last entry */ - //7b83 - if (esp14 == -1) - hwwrite(vortex->mmio, - VORTEX_MIXER_CHNBASE + - (ch << 2), esp18 & 0xef); - else { - ebx = (0xffffffe0 & edx) | (0xf & ebx); - hwwrite(vortex->mmio, - VORTEX_MIXER_RTBASE + - (esp14 << 2), ebx); - //printk(KERN_INFO "vortex mixdelWTD last addr= 0x%x, val= 0x%x\n", esp14, ebx); - } - hwwrite(vortex->mmio, - VORTEX_MIXER_RTBASE + ebp, 0); - return 1; - } - } - } else { - //printk(KERN_INFO "removed last mix\n"); - //7be0 - vortex_mixer_dis_sr(vortex, ch); - hwwrite(vortex->mmio, ebp, 0); - } - return 1; -} - -static void vortex_mixer_init(vortex_t * vortex) -{ - u32 addr; - int x; - - // FIXME: get rid of this crap. - memset(mchannels, 0, NR_MIXOUT * sizeof(int)); - memset(rampchs, 0, NR_MIXOUT * sizeof(int)); - - addr = VORTEX_MIX_SMP + 0x17c; - for (x = 0x5f; x >= 0; x--) { - hwwrite(vortex->mmio, addr, 0); - addr -= 4; - } - addr = VORTEX_MIX_ENIN + 0x1fc; - for (x = 0x7f; x >= 0; x--) { - hwwrite(vortex->mmio, addr, 0); - addr -= 4; - } - addr = VORTEX_MIX_SMP + 0x17c; - for (x = 0x5f; x >= 0; x--) { - hwwrite(vortex->mmio, addr, 0); - addr -= 4; - } - addr = VORTEX_MIX_INVOL_A + 0x7fc; - for (x = 0x1ff; x >= 0; x--) { - hwwrite(vortex->mmio, addr, 0x80); - addr -= 4; - } - addr = VORTEX_MIX_VOL_A + 0x3c; - for (x = 0xf; x >= 0; x--) { - hwwrite(vortex->mmio, addr, 0x80); - addr -= 4; - } - addr = VORTEX_MIX_INVOL_B + 0x7fc; - for (x = 0x1ff; x >= 0; x--) { - hwwrite(vortex->mmio, addr, 0x80); - addr -= 4; - } - addr = VORTEX_MIX_VOL_B + 0x3c; - for (x = 0xf; x >= 0; x--) { - hwwrite(vortex->mmio, addr, 0x80); - addr -= 4; - } - addr = VORTEX_MIXER_RTBASE + (MIXER_RTBASE_SIZE - 1) * 4; - for (x = (MIXER_RTBASE_SIZE - 1); x >= 0; x--) { - hwwrite(vortex->mmio, addr, 0x0); - addr -= 4; - } - hwwrite(vortex->mmio, VORTEX_MIXER_SR, 0); - - /* Set clipping ceiling (this may be all wrong). */ - /* - for (x = 0; x < 0x80; x++) { - hwwrite(vortex->mmio, VORTEX_MIXER_CLIP + (x << 2), 0x3ffff); - } - */ - /* - call CAsp4Mix__Initialize_CAsp4HwIO____CAsp4Mixer____ - Register ISR callback for volume smooth fade out. - Maybe this avoids clicks when press "stop" ? - */ -} - -/* SRC (CAsp4Src.s and CAsp4SrcBlock) */ - -static void vortex_src_en_sr(vortex_t * vortex, int channel) -{ - hwwrite(vortex->mmio, VORTEX_SRCBLOCK_SR, - hwread(vortex->mmio, VORTEX_SRCBLOCK_SR) | (0x1 << channel)); -} - -static void vortex_src_dis_sr(vortex_t * vortex, int channel) -{ - hwwrite(vortex->mmio, VORTEX_SRCBLOCK_SR, - hwread(vortex->mmio, VORTEX_SRCBLOCK_SR) & ~(0x1 << channel)); -} - -static void vortex_src_flushbuffers(vortex_t * vortex, unsigned char src) -{ - int i; - - for (i = 0x1f; i >= 0; i--) - hwwrite(vortex->mmio, - VORTEX_SRC_DATA0 + (src << 7) + (i << 2), 0); - hwwrite(vortex->mmio, VORTEX_SRC_DATA + (src << 3), 0); - hwwrite(vortex->mmio, VORTEX_SRC_DATA + (src << 3) + 4, 0); -} - -static void vortex_src_cleardrift(vortex_t * vortex, unsigned char src) -{ - hwwrite(vortex->mmio, VORTEX_SRC_DRIFT0 + (src << 2), 0); - hwwrite(vortex->mmio, VORTEX_SRC_DRIFT1 + (src << 2), 0); - hwwrite(vortex->mmio, VORTEX_SRC_DRIFT2 + (src << 2), 1); -} - -static void -vortex_src_set_throttlesource(vortex_t * vortex, unsigned char src, int en) -{ - int temp; - - temp = hwread(vortex->mmio, VORTEX_SRC_SOURCE); - if (en) - temp |= 1 << src; - else - temp &= ~(1 << src); - hwwrite(vortex->mmio, VORTEX_SRC_SOURCE, temp); -} - -static int -vortex_src_persist_convratio(vortex_t * vortex, unsigned char src, int ratio) -{ - int temp, lifeboat = 0; - - do { - hwwrite(vortex->mmio, VORTEX_SRC_CONVRATIO + (src << 2), ratio); - temp = hwread(vortex->mmio, VORTEX_SRC_CONVRATIO + (src << 2)); - if ((++lifeboat) > 0x9) { - printk(KERN_ERR "Vortex: Src cvr fail\n"); - break; - } - } - while (temp != ratio); - return temp; -} - -#if 0 -static void vortex_src_slowlock(vortex_t * vortex, unsigned char src) -{ - int temp; - - hwwrite(vortex->mmio, VORTEX_SRC_DRIFT2 + (src << 2), 1); - hwwrite(vortex->mmio, VORTEX_SRC_DRIFT0 + (src << 2), 0); - temp = hwread(vortex->mmio, VORTEX_SRC_U0 + (src << 2)); - if (temp & 0x200) - hwwrite(vortex->mmio, VORTEX_SRC_U0 + (src << 2), - temp & ~0x200L); -} - -static void -vortex_src_change_convratio(vortex_t * vortex, unsigned char src, int ratio) -{ - int temp, a; - - if ((ratio & 0x10000) && (ratio != 0x10000)) { - if (ratio & 0x3fff) - a = (0x11 - ((ratio >> 0xe) & 0x3)) - 1; - else - a = (0x11 - ((ratio >> 0xe) & 0x3)) - 2; - } else - a = 0xc; - temp = hwread(vortex->mmio, VORTEX_SRC_U0 + (src << 2)); - if (((temp >> 4) & 0xf) != a) - hwwrite(vortex->mmio, VORTEX_SRC_U0 + (src << 2), - (temp & 0xf) | ((a & 0xf) << 4)); - - vortex_src_persist_convratio(vortex, src, ratio); -} - -static int -vortex_src_checkratio(vortex_t * vortex, unsigned char src, - unsigned int desired_ratio) -{ - int hw_ratio, lifeboat = 0; - - hw_ratio = hwread(vortex->mmio, VORTEX_SRC_CONVRATIO + (src << 2)); - - while (hw_ratio != desired_ratio) { - hwwrite(vortex->mmio, VORTEX_SRC_CONVRATIO + (src << 2), desired_ratio); - - if ((lifeboat++) > 15) { - printk(KERN_ERR "Vortex: could not set src-%d from %d to %d\n", - src, hw_ratio, desired_ratio); - break; - } - } - - return hw_ratio; -} - -#endif -/* - Objective: Set samplerate for given SRC module. - Arguments: - card: pointer to vortex_t strcut. - src: Integer index of the SRC module. - cr: Current sample rate conversion factor. - b: unknown 16 bit value. - sweep: Enable Samplerate fade from cr toward tr flag. - dirplay: 1: playback, 0: recording. - sl: Slow Lock flag. - tr: Target samplerate conversion. - thsource: Throttle source flag (no idea what that means). -*/ -static void vortex_src_setupchannel(vortex_t * card, unsigned char src, - unsigned int cr, unsigned int b, int sweep, int d, - int dirplay, int sl, unsigned int tr, int thsource) -{ - // noplayback: d=2,4,7,0xa,0xb when using first 2 src's. - // c: enables pitch sweep. - // looks like g is c related. Maybe g is a sweep parameter ? - // g = cvr - // dirplay: 0 = recording, 1 = playback - // d = src hw index. - - int esi, ebp = 0, esp10; - - vortex_src_flushbuffers(card, src); - - if (sweep) { - if ((tr & 0x10000) && (tr != 0x10000)) { - tr = 0; - esi = 0x7; - } else { - if ((((short)tr) < 0) && (tr != 0x8000)) { - tr = 0; - esi = 0x8; - } else { - tr = 1; - esi = 0xc; - } - } - } else { - if ((cr & 0x10000) && (cr != 0x10000)) { - tr = 0; /*ebx = 0 */ - esi = 0x11 - ((cr >> 0xe) & 7); - if (cr & 0x3fff) - esi -= 1; - else - esi -= 2; - } else { - tr = 1; - esi = 0xc; - } - } - vortex_src_cleardrift(card, src); - vortex_src_set_throttlesource(card, src, thsource); - - if ((dirplay == 0) && (sweep == 0)) { - if (tr) - esp10 = 0xf; - else - esp10 = 0xc; - ebp = 0; - } else { - if (tr) - ebp = 0xf; - else - ebp = 0xc; - esp10 = 0; - } - hwwrite(card->mmio, VORTEX_SRC_U0 + (src << 2), - (sl << 0x9) | (sweep << 0x8) | ((esi & 0xf) << 4) | d); - /* 0xc0 esi=0xc c=f=0 d=0 */ - vortex_src_persist_convratio(card, src, cr); - hwwrite(card->mmio, VORTEX_SRC_U1 + (src << 2), b & 0xffff); - /* 0 b=0 */ - hwwrite(card->mmio, VORTEX_SRC_U2 + (src << 2), - (tr << 0x11) | (dirplay << 0x10) | (ebp << 0x8) | esp10); - /* 0x30f00 e=g=1 esp10=0 ebp=f */ - //printk(KERN_INFO "vortex: SRC %d, d=0x%x, esi=0x%x, esp10=0x%x, ebp=0x%x\n", src, d, esi, esp10, ebp); -} - -static void vortex_srcblock_init(vortex_t * vortex) -{ - u32 addr; - int x; - hwwrite(vortex->mmio, VORTEX_SRC_SOURCESIZE, 0x1ff); - /* - for (x=0; x<0x10; x++) { - vortex_src_init(&vortex_src[x], x); - } - */ - //addr = 0xcc3c; - //addr = 0x26c3c; - addr = VORTEX_SRC_RTBASE + 0x3c; - for (x = 0xf; x >= 0; x--) { - hwwrite(vortex->mmio, addr, 0); - addr -= 4; - } - //addr = 0xcc94; - //addr = 0x26c94; - addr = VORTEX_SRC_CHNBASE + 0x54; - for (x = 0x15; x >= 0; x--) { - hwwrite(vortex->mmio, addr, 0); - addr -= 4; - } -} - -static int -vortex_src_addWTD(vortex_t * vortex, unsigned char src, unsigned char ch) -{ - int temp, lifeboat = 0, prev; - // esp13 = src - - temp = hwread(vortex->mmio, VORTEX_SRCBLOCK_SR); - if ((temp & (1 << ch)) == 0) { - hwwrite(vortex->mmio, VORTEX_SRC_CHNBASE + (ch << 2), src); - vortex_src_en_sr(vortex, ch); - return 1; - } - prev = VORTEX_SRC_CHNBASE + (ch << 2); /*ebp */ - temp = hwread(vortex->mmio, prev); - //while (temp & NR_SRC) { - while (temp & 0x10) { - prev = VORTEX_SRC_RTBASE + ((temp & 0xf) << 2); /*esp12 */ - //prev = VORTEX_SRC_RTBASE + ((temp & (NR_SRC-1)) << 2); /*esp12*/ - temp = hwread(vortex->mmio, prev); - //printk(KERN_INFO "vortex: srcAddWTD: while addr=%x, val=%x\n", prev, temp); - if ((++lifeboat) > 0xf) { - printk(KERN_ERR - "vortex_src_addWTD: lifeboat overflow\n"); - return 0; - } - } - hwwrite(vortex->mmio, VORTEX_SRC_RTBASE + ((temp & 0xf) << 2), src); - //hwwrite(vortex->mmio, prev, (temp & (NR_SRC-1)) | NR_SRC); - hwwrite(vortex->mmio, prev, (temp & 0xf) | 0x10); - return 1; -} - -static int -vortex_src_delWTD(vortex_t * vortex, unsigned char src, unsigned char ch) -{ - int esp14 = -1, esp18, eax, ebx, edx, ebp, esi = 0; - //int esp1f=edi(while)=src, esp10=ch; - - eax = hwread(vortex->mmio, VORTEX_SRCBLOCK_SR); - if (((1 << ch) & eax) == 0) { - printk(KERN_ERR "src alarm\n"); - return 0; - } - ebp = VORTEX_SRC_CHNBASE + (ch << 2); - esp18 = hwread(vortex->mmio, ebp); - if (esp18 & 0x10) { - ebx = (esp18 & 0xf); - if (src == ebx) { - ebx = VORTEX_SRC_RTBASE + (src << 2); - edx = hwread(vortex->mmio, ebx); - //7b60 - hwwrite(vortex->mmio, ebp, edx); - hwwrite(vortex->mmio, ebx, 0); - } else { - //7ad3 - edx = - hwread(vortex->mmio, - VORTEX_SRC_RTBASE + (ebx << 2)); - //printk(KERN_INFO "vortex: srcdelWTD: 1 addr=%x, val=%x, src=%x\n", ebx, edx, src); - while ((edx & 0xf) != src) { - if ((esi) > 0xf) { - printk - ("vortex: srcdelWTD: error, lifeboat overflow\n"); - return 0; - } - esp14 = ebx; - ebx = edx & 0xf; - ebp = ebx << 2; - edx = - hwread(vortex->mmio, - VORTEX_SRC_RTBASE + ebp); - //printk(KERN_INFO "vortex: srcdelWTD: while addr=%x, val=%x\n", ebp, edx); - esi++; - } - //7b30 - ebp = ebx << 2; - if (edx & 0x10) { /* Delete entry in between others */ - ebx = VORTEX_SRC_RTBASE + ((edx & 0xf) << 2); - edx = hwread(vortex->mmio, ebx); - //7b60 - hwwrite(vortex->mmio, - VORTEX_SRC_RTBASE + ebp, edx); - hwwrite(vortex->mmio, ebx, 0); - //printk(KERN_INFO "vortex srcdelWTD between addr= 0x%x, val= 0x%x\n", ebp, edx); - } else { /* Delete last entry */ - //7b83 - if (esp14 == -1) - hwwrite(vortex->mmio, - VORTEX_SRC_CHNBASE + - (ch << 2), esp18 & 0xef); - else { - ebx = (0xffffffe0 & edx) | (0xf & ebx); - hwwrite(vortex->mmio, - VORTEX_SRC_RTBASE + - (esp14 << 2), ebx); - //printk(KERN_INFO"vortex srcdelWTD last addr= 0x%x, val= 0x%x\n", esp14, ebx); - } - hwwrite(vortex->mmio, - VORTEX_SRC_RTBASE + ebp, 0); - return 1; - } - } - } else { - //7be0 - vortex_src_dis_sr(vortex, ch); - hwwrite(vortex->mmio, ebp, 0); - } - return 1; -} - - /*FIFO*/ - -static void -vortex_fifo_clearadbdata(vortex_t * vortex, int fifo, int x) -{ - for (x--; x >= 0; x--) - hwwrite(vortex->mmio, - VORTEX_FIFO_ADBDATA + - (((fifo << FIFO_SIZE_BITS) + x) << 2), 0); -} - -#if 0 -static void vortex_fifo_adbinitialize(vortex_t * vortex, int fifo, int j) -{ - vortex_fifo_clearadbdata(vortex, fifo, FIFO_SIZE); -#ifdef CHIP_AU8820 - hwwrite(vortex->mmio, VORTEX_FIFO_ADBCTRL + (fifo << 2), - (FIFO_U1 | ((j & FIFO_MASK) << 0xb))); -#else - hwwrite(vortex->mmio, VORTEX_FIFO_ADBCTRL + (fifo << 2), - (FIFO_U1 | ((j & FIFO_MASK) << 0xc))); -#endif -} -#endif -static void vortex_fifo_setadbvalid(vortex_t * vortex, int fifo, int en) -{ - hwwrite(vortex->mmio, VORTEX_FIFO_ADBCTRL + (fifo << 2), - (hwread(vortex->mmio, VORTEX_FIFO_ADBCTRL + (fifo << 2)) & - 0xffffffef) | ((1 & en) << 4) | FIFO_U1); -} - -static void -vortex_fifo_setadbctrl(vortex_t * vortex, int fifo, int stereo, int priority, - int empty, int valid, int f) -{ - int temp, lifeboat = 0; - //int this_8[NR_ADB] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; /* position */ - int this_4 = 0x2; - /* f seems priority related. - * CAsp4AdbDma::SetPriority is the only place that calls SetAdbCtrl with f set to 1 - * every where else it is set to 0. It seems, however, that CAsp4AdbDma::SetPriority - * is never called, thus the f related bits remain a mystery for now. - */ - do { - temp = hwread(vortex->mmio, VORTEX_FIFO_ADBCTRL + (fifo << 2)); - if (lifeboat++ > 0xbb8) { - printk(KERN_ERR - "Vortex: vortex_fifo_setadbctrl fail\n"); - break; - } - } - while (temp & FIFO_RDONLY); - - // AU8830 semes to take some special care about fifo content (data). - // But i'm just to lazy to translate that :) - if (valid) { - if ((temp & FIFO_VALID) == 0) { - //this_8[fifo] = 0; - vortex_fifo_clearadbdata(vortex, fifo, FIFO_SIZE); // this_4 -#ifdef CHIP_AU8820 - temp = (this_4 & 0x1f) << 0xb; -#else - temp = (this_4 & 0x3f) << 0xc; -#endif - temp = (temp & 0xfffffffd) | ((stereo & 1) << 1); - temp = (temp & 0xfffffff3) | ((priority & 3) << 2); - temp = (temp & 0xffffffef) | ((valid & 1) << 4); - temp |= FIFO_U1; - temp = (temp & 0xffffffdf) | ((empty & 1) << 5); -#ifdef CHIP_AU8820 - temp = (temp & 0xfffbffff) | ((f & 1) << 0x12); -#endif -#ifdef CHIP_AU8830 - temp = (temp & 0xf7ffffff) | ((f & 1) << 0x1b); - temp = (temp & 0xefffffff) | ((f & 1) << 0x1c); -#endif -#ifdef CHIP_AU8810 - temp = (temp & 0xfeffffff) | ((f & 1) << 0x18); - temp = (temp & 0xfdffffff) | ((f & 1) << 0x19); -#endif - } - } else { - if (temp & FIFO_VALID) { -#ifdef CHIP_AU8820 - temp = ((f & 1) << 0x12) | (temp & 0xfffbffef); -#endif -#ifdef CHIP_AU8830 - temp = - ((f & 1) << 0x1b) | (temp & 0xe7ffffef) | FIFO_BITS; -#endif -#ifdef CHIP_AU8810 - temp = - ((f & 1) << 0x18) | (temp & 0xfcffffef) | FIFO_BITS; -#endif - } else - /*if (this_8[fifo]) */ - vortex_fifo_clearadbdata(vortex, fifo, FIFO_SIZE); - } - hwwrite(vortex->mmio, VORTEX_FIFO_ADBCTRL + (fifo << 2), temp); - hwread(vortex->mmio, VORTEX_FIFO_ADBCTRL + (fifo << 2)); -} - -#ifndef CHIP_AU8810 -static void vortex_fifo_clearwtdata(vortex_t * vortex, int fifo, int x) -{ - if (x < 1) - return; - for (x--; x >= 0; x--) - hwwrite(vortex->mmio, - VORTEX_FIFO_WTDATA + - (((fifo << FIFO_SIZE_BITS) + x) << 2), 0); -} - -static void vortex_fifo_wtinitialize(vortex_t * vortex, int fifo, int j) -{ - vortex_fifo_clearwtdata(vortex, fifo, FIFO_SIZE); -#ifdef CHIP_AU8820 - hwwrite(vortex->mmio, VORTEX_FIFO_WTCTRL + (fifo << 2), - (FIFO_U1 | ((j & FIFO_MASK) << 0xb))); -#else - hwwrite(vortex->mmio, VORTEX_FIFO_WTCTRL + (fifo << 2), - (FIFO_U1 | ((j & FIFO_MASK) << 0xc))); -#endif -} - -static void vortex_fifo_setwtvalid(vortex_t * vortex, int fifo, int en) -{ - hwwrite(vortex->mmio, VORTEX_FIFO_WTCTRL + (fifo << 2), - (hwread(vortex->mmio, VORTEX_FIFO_WTCTRL + (fifo << 2)) & - 0xffffffef) | ((en & 1) << 4) | FIFO_U1); -} - -static void -vortex_fifo_setwtctrl(vortex_t * vortex, int fifo, int ctrl, int priority, - int empty, int valid, int f) -{ - int temp = 0, lifeboat = 0; - int this_4 = 2; - - do { - temp = hwread(vortex->mmio, VORTEX_FIFO_WTCTRL + (fifo << 2)); - if (lifeboat++ > 0xbb8) { - printk(KERN_ERR "Vortex: vortex_fifo_setwtctrl fail\n"); - break; - } - } - while (temp & FIFO_RDONLY); - - if (valid) { - if ((temp & FIFO_VALID) == 0) { - vortex_fifo_clearwtdata(vortex, fifo, FIFO_SIZE); // this_4 -#ifdef CHIP_AU8820 - temp = (this_4 & 0x1f) << 0xb; -#else - temp = (this_4 & 0x3f) << 0xc; -#endif - temp = (temp & 0xfffffffd) | ((ctrl & 1) << 1); - temp = (temp & 0xfffffff3) | ((priority & 3) << 2); - temp = (temp & 0xffffffef) | ((valid & 1) << 4); - temp |= FIFO_U1; - temp = (temp & 0xffffffdf) | ((empty & 1) << 5); -#ifdef CHIP_AU8820 - temp = (temp & 0xfffbffff) | ((f & 1) << 0x12); -#endif -#ifdef CHIP_AU8830 - temp = (temp & 0xf7ffffff) | ((f & 1) << 0x1b); - temp = (temp & 0xefffffff) | ((f & 1) << 0x1c); -#endif -#ifdef CHIP_AU8810 - temp = (temp & 0xfeffffff) | ((f & 1) << 0x18); - temp = (temp & 0xfdffffff) | ((f & 1) << 0x19); -#endif - } - } else { - if (temp & FIFO_VALID) { -#ifdef CHIP_AU8820 - temp = ((f & 1) << 0x12) | (temp & 0xfffbffef); -#endif -#ifdef CHIP_AU8830 - temp = - ((f & 1) << 0x1b) | (temp & 0xe7ffffef) | FIFO_BITS; -#endif -#ifdef CHIP_AU8810 - temp = - ((f & 1) << 0x18) | (temp & 0xfcffffef) | FIFO_BITS; -#endif - } else - /*if (this_8[fifo]) */ - vortex_fifo_clearwtdata(vortex, fifo, FIFO_SIZE); - } - hwwrite(vortex->mmio, VORTEX_FIFO_WTCTRL + (fifo << 2), temp); - hwread(vortex->mmio, VORTEX_FIFO_WTCTRL + (fifo << 2)); - -/* - do { - temp = hwread(vortex->mmio, VORTEX_FIFO_WTCTRL + (fifo << 2)); - if (lifeboat++ > 0xbb8) { - printk(KERN_ERR "Vortex: vortex_fifo_setwtctrl fail (hanging)\n"); - break; - } - } while ((temp & FIFO_RDONLY)&&(temp & FIFO_VALID)&&(temp != 0xFFFFFFFF)); - - - if (valid) { - if (temp & FIFO_VALID) { - temp = 0x40000; - //temp |= 0x08000000; - //temp |= 0x10000000; - //temp |= 0x04000000; - //temp |= 0x00400000; - temp |= 0x1c400000; - temp &= 0xFFFFFFF3; - temp &= 0xFFFFFFEF; - temp |= (valid & 1) << 4; - hwwrite(vortex->mmio, VORTEX_FIFO_WTCTRL + (fifo << 2), temp); - return; - } else { - vortex_fifo_clearwtdata(vortex, fifo, FIFO_SIZE); - return; - } - } else { - temp &= 0xffffffef; - temp |= 0x08000000; - temp |= 0x10000000; - temp |= 0x04000000; - temp |= 0x00400000; - hwwrite(vortex->mmio, VORTEX_FIFO_WTCTRL + (fifo << 2), temp); - temp = hwread(vortex->mmio, VORTEX_FIFO_WTCTRL + (fifo << 2)); - //((temp >> 6) & 0x3f) - - priority = 0; - if (((temp & 0x0fc0) ^ ((temp >> 6) & 0x0fc0)) & 0FFFFFFC0) - vortex_fifo_clearwtdata(vortex, fifo, FIFO_SIZE); - valid = 0xfb; - temp = (temp & 0xfffffffd) | ((ctrl & 1) << 1); - temp = (temp & 0xfffdffff) | ((f & 1) << 0x11); - temp = (temp & 0xfffffff3) | ((priority & 3) << 2); - temp = (temp & 0xffffffef) | ((valid & 1) << 4); - temp = (temp & 0xffffffdf) | ((empty & 1) << 5); - hwwrite(vortex->mmio, VORTEX_FIFO_WTCTRL + (fifo << 2), temp); - } - - */ - - /* - temp = (temp & 0xfffffffd) | ((ctrl & 1) << 1); - temp = (temp & 0xfffdffff) | ((f & 1) << 0x11); - temp = (temp & 0xfffffff3) | ((priority & 3) << 2); - temp = (temp & 0xffffffef) | ((valid & 1) << 4); - temp = (temp & 0xffffffdf) | ((empty & 1) << 5); - #ifdef FIFO_BITS - temp = temp | FIFO_BITS | 40000; - #endif - // 0x1c440010, 0x1c400000 - hwwrite(vortex->mmio, VORTEX_FIFO_WTCTRL + (fifo << 2), temp); - */ -} - -#endif -static void vortex_fifo_init(vortex_t * vortex) -{ - int x; - u32 addr; - - /* ADB DMA channels fifos. */ - addr = VORTEX_FIFO_ADBCTRL + ((NR_ADB - 1) * 4); - for (x = NR_ADB - 1; x >= 0; x--) { - hwwrite(vortex->mmio, addr, (FIFO_U0 | FIFO_U1)); - if (hwread(vortex->mmio, addr) != (FIFO_U0 | FIFO_U1)) - printk(KERN_ERR "bad adb fifo reset!"); - vortex_fifo_clearadbdata(vortex, x, FIFO_SIZE); - addr -= 4; - } - -#ifndef CHIP_AU8810 - /* WT DMA channels fifos. */ - addr = VORTEX_FIFO_WTCTRL + ((NR_WT - 1) * 4); - for (x = NR_WT - 1; x >= 0; x--) { - hwwrite(vortex->mmio, addr, FIFO_U0); - if (hwread(vortex->mmio, addr) != FIFO_U0) - printk(KERN_ERR - "bad wt fifo reset (0x%08x, 0x%08x)!\n", - addr, hwread(vortex->mmio, addr)); - vortex_fifo_clearwtdata(vortex, x, FIFO_SIZE); - addr -= 4; - } -#endif - /* trigger... */ -#ifdef CHIP_AU8820 - hwwrite(vortex->mmio, 0xf8c0, 0xd03); //0x0843 0xd6b -#else -#ifdef CHIP_AU8830 - hwwrite(vortex->mmio, 0x17000, 0x61); /* wt a */ - hwwrite(vortex->mmio, 0x17004, 0x61); /* wt b */ -#endif - hwwrite(vortex->mmio, 0x17008, 0x61); /* adb */ -#endif -} - -/* ADBDMA */ - -static void vortex_adbdma_init(vortex_t * vortex) -{ -} - -static void vortex_adbdma_setfirstbuffer(vortex_t * vortex, int adbdma) -{ - stream_t *dma = &vortex->dma_adb[adbdma]; - - hwwrite(vortex->mmio, VORTEX_ADBDMA_CTRL + (adbdma << 2), - dma->dma_ctrl); -} - -static void vortex_adbdma_setstartbuffer(vortex_t * vortex, int adbdma, int sb) -{ - stream_t *dma = &vortex->dma_adb[adbdma]; - //hwwrite(vortex->mmio, VORTEX_ADBDMA_START + (adbdma << 2), sb << (((NR_ADB-1)-((adbdma&0xf)*2)))); - hwwrite(vortex->mmio, VORTEX_ADBDMA_START + (adbdma << 2), - sb << ((0xf - (adbdma & 0xf)) * 2)); - dma->period_real = dma->period_virt = sb; -} - -static void -vortex_adbdma_setbuffers(vortex_t * vortex, int adbdma, - int psize, int count) -{ - stream_t *dma = &vortex->dma_adb[adbdma]; - - dma->period_bytes = psize; - dma->nr_periods = count; - - dma->cfg0 = 0; - dma->cfg1 = 0; - switch (count) { - /* Four or more pages */ - default: - case 4: - dma->cfg1 |= 0x88000000 | 0x44000000 | 0x30000000 | (psize - 1); - hwwrite(vortex->mmio, - VORTEX_ADBDMA_BUFBASE + (adbdma << 4) + 0xc, - snd_pcm_sgbuf_get_addr(dma->substream, psize * 3)); - /* 3 pages */ - case 3: - dma->cfg0 |= 0x12000000; - dma->cfg1 |= 0x80000000 | 0x40000000 | ((psize - 1) << 0xc); - hwwrite(vortex->mmio, - VORTEX_ADBDMA_BUFBASE + (adbdma << 4) + 0x8, - snd_pcm_sgbuf_get_addr(dma->substream, psize * 2)); - /* 2 pages */ - case 2: - dma->cfg0 |= 0x88000000 | 0x44000000 | 0x10000000 | (psize - 1); - hwwrite(vortex->mmio, - VORTEX_ADBDMA_BUFBASE + (adbdma << 4) + 0x4, - snd_pcm_sgbuf_get_addr(dma->substream, psize)); - /* 1 page */ - case 1: - dma->cfg0 |= 0x80000000 | 0x40000000 | ((psize - 1) << 0xc); - hwwrite(vortex->mmio, - VORTEX_ADBDMA_BUFBASE + (adbdma << 4), - snd_pcm_sgbuf_get_addr(dma->substream, 0)); - break; - } - /* - printk(KERN_DEBUG "vortex: cfg0 = 0x%x\nvortex: cfg1=0x%x\n", - dma->cfg0, dma->cfg1); - */ - hwwrite(vortex->mmio, VORTEX_ADBDMA_BUFCFG0 + (adbdma << 3), dma->cfg0); - hwwrite(vortex->mmio, VORTEX_ADBDMA_BUFCFG1 + (adbdma << 3), dma->cfg1); - - vortex_adbdma_setfirstbuffer(vortex, adbdma); - vortex_adbdma_setstartbuffer(vortex, adbdma, 0); -} - -static void -vortex_adbdma_setmode(vortex_t * vortex, int adbdma, int ie, int dir, - int fmt, int stereo, u32 offset) -{ - stream_t *dma = &vortex->dma_adb[adbdma]; - - dma->dma_unknown = stereo; - dma->dma_ctrl = - ((offset & OFFSET_MASK) | (dma->dma_ctrl & ~OFFSET_MASK)); - /* Enable PCMOUT interrupts. */ - dma->dma_ctrl = - (dma->dma_ctrl & ~IE_MASK) | ((ie << IE_SHIFT) & IE_MASK); - - dma->dma_ctrl = - (dma->dma_ctrl & ~DIR_MASK) | ((dir << DIR_SHIFT) & DIR_MASK); - dma->dma_ctrl = - (dma->dma_ctrl & ~FMT_MASK) | ((fmt << FMT_SHIFT) & FMT_MASK); - - hwwrite(vortex->mmio, VORTEX_ADBDMA_CTRL + (adbdma << 2), - dma->dma_ctrl); - hwread(vortex->mmio, VORTEX_ADBDMA_CTRL + (adbdma << 2)); -} - -static int vortex_adbdma_bufshift(vortex_t * vortex, int adbdma) -{ - stream_t *dma = &vortex->dma_adb[adbdma]; - int page, p, pp, delta, i; - - page = - (hwread(vortex->mmio, VORTEX_ADBDMA_STAT + (adbdma << 2)) & - ADB_SUBBUF_MASK) >> ADB_SUBBUF_SHIFT; - if (dma->nr_periods >= 4) - delta = (page - dma->period_real) & 3; - else { - delta = (page - dma->period_real); - if (delta < 0) - delta += dma->nr_periods; - } - if (delta == 0) - return 0; - - /* refresh hw page table */ - if (dma->nr_periods > 4) { - for (i = 0; i < delta; i++) { - /* p: audio buffer page index */ - p = dma->period_virt + i + 4; - if (p >= dma->nr_periods) - p -= dma->nr_periods; - /* pp: hardware DMA page index. */ - pp = dma->period_real + i; - if (pp >= 4) - pp -= 4; - //hwwrite(vortex->mmio, VORTEX_ADBDMA_BUFBASE+(((adbdma << 2)+pp) << 2), dma->table[p].addr); - hwwrite(vortex->mmio, - VORTEX_ADBDMA_BUFBASE + (((adbdma << 2) + pp) << 2), - snd_pcm_sgbuf_get_addr(dma->substream, - dma->period_bytes * p)); - /* Force write thru cache. */ - hwread(vortex->mmio, VORTEX_ADBDMA_BUFBASE + - (((adbdma << 2) + pp) << 2)); - } - } - dma->period_virt += delta; - dma->period_real = page; - if (dma->period_virt >= dma->nr_periods) - dma->period_virt -= dma->nr_periods; - if (delta != 1) - printk(KERN_INFO "vortex: %d virt=%d, real=%d, delta=%d\n", - adbdma, dma->period_virt, dma->period_real, delta); - - return delta; -} - - -static void vortex_adbdma_resetup(vortex_t *vortex, int adbdma) { - stream_t *dma = &vortex->dma_adb[adbdma]; - int p, pp, i; - - /* refresh hw page table */ - for (i=0 ; i < 4 && i < dma->nr_periods; i++) { - /* p: audio buffer page index */ - p = dma->period_virt + i; - if (p >= dma->nr_periods) - p -= dma->nr_periods; - /* pp: hardware DMA page index. */ - pp = dma->period_real + i; - if (dma->nr_periods < 4) { - if (pp >= dma->nr_periods) - pp -= dma->nr_periods; - } - else { - if (pp >= 4) - pp -= 4; - } - hwwrite(vortex->mmio, - VORTEX_ADBDMA_BUFBASE + (((adbdma << 2) + pp) << 2), - snd_pcm_sgbuf_get_addr(dma->substream, - dma->period_bytes * p)); - /* Force write thru cache. */ - hwread(vortex->mmio, VORTEX_ADBDMA_BUFBASE + (((adbdma << 2)+pp) << 2)); - } -} - -static inline int vortex_adbdma_getlinearpos(vortex_t * vortex, int adbdma) -{ - stream_t *dma = &vortex->dma_adb[adbdma]; - int temp, page, delta; - - temp = hwread(vortex->mmio, VORTEX_ADBDMA_STAT + (adbdma << 2)); - page = (temp & ADB_SUBBUF_MASK) >> ADB_SUBBUF_SHIFT; - if (dma->nr_periods >= 4) - delta = (page - dma->period_real) & 3; - else { - delta = (page - dma->period_real); - if (delta < 0) - delta += dma->nr_periods; - } - return (dma->period_virt + delta) * dma->period_bytes - + (temp & (dma->period_bytes - 1)); -} - -static void vortex_adbdma_startfifo(vortex_t * vortex, int adbdma) -{ - int this_8 = 0 /*empty */ , this_4 = 0 /*priority */ ; - stream_t *dma = &vortex->dma_adb[adbdma]; - - switch (dma->fifo_status) { - case FIFO_START: - vortex_fifo_setadbvalid(vortex, adbdma, - dma->fifo_enabled ? 1 : 0); - break; - case FIFO_STOP: - this_8 = 1; - hwwrite(vortex->mmio, VORTEX_ADBDMA_CTRL + (adbdma << 2), - dma->dma_ctrl); - vortex_fifo_setadbctrl(vortex, adbdma, dma->dma_unknown, - this_4, this_8, - dma->fifo_enabled ? 1 : 0, 0); - break; - case FIFO_PAUSE: - vortex_fifo_setadbctrl(vortex, adbdma, dma->dma_unknown, - this_4, this_8, - dma->fifo_enabled ? 1 : 0, 0); - break; - } - dma->fifo_status = FIFO_START; -} - -static void vortex_adbdma_resumefifo(vortex_t * vortex, int adbdma) -{ - stream_t *dma = &vortex->dma_adb[adbdma]; - - int this_8 = 1, this_4 = 0; - switch (dma->fifo_status) { - case FIFO_STOP: - hwwrite(vortex->mmio, VORTEX_ADBDMA_CTRL + (adbdma << 2), - dma->dma_ctrl); - vortex_fifo_setadbctrl(vortex, adbdma, dma->dma_unknown, - this_4, this_8, - dma->fifo_enabled ? 1 : 0, 0); - break; - case FIFO_PAUSE: - vortex_fifo_setadbctrl(vortex, adbdma, dma->dma_unknown, - this_4, this_8, - dma->fifo_enabled ? 1 : 0, 0); - break; - } - dma->fifo_status = FIFO_START; -} - -static void vortex_adbdma_pausefifo(vortex_t * vortex, int adbdma) -{ - stream_t *dma = &vortex->dma_adb[adbdma]; - - int this_8 = 0, this_4 = 0; - switch (dma->fifo_status) { - case FIFO_START: - vortex_fifo_setadbctrl(vortex, adbdma, dma->dma_unknown, - this_4, this_8, 0, 0); - break; - case FIFO_STOP: - hwwrite(vortex->mmio, VORTEX_ADBDMA_CTRL + (adbdma << 2), - dma->dma_ctrl); - vortex_fifo_setadbctrl(vortex, adbdma, dma->dma_unknown, - this_4, this_8, 0, 0); - break; - } - dma->fifo_status = FIFO_PAUSE; -} - -static void vortex_adbdma_stopfifo(vortex_t * vortex, int adbdma) -{ - stream_t *dma = &vortex->dma_adb[adbdma]; - - int this_4 = 0, this_8 = 0; - if (dma->fifo_status == FIFO_START) - vortex_fifo_setadbctrl(vortex, adbdma, dma->dma_unknown, - this_4, this_8, 0, 0); - else if (dma->fifo_status == FIFO_STOP) - return; - dma->fifo_status = FIFO_STOP; - dma->fifo_enabled = 0; -} - -/* WTDMA */ - -#ifndef CHIP_AU8810 -static void vortex_wtdma_setfirstbuffer(vortex_t * vortex, int wtdma) -{ - //int this_7c=dma_ctrl; - stream_t *dma = &vortex->dma_wt[wtdma]; - - hwwrite(vortex->mmio, VORTEX_WTDMA_CTRL + (wtdma << 2), dma->dma_ctrl); -} - -static void vortex_wtdma_setstartbuffer(vortex_t * vortex, int wtdma, int sb) -{ - stream_t *dma = &vortex->dma_wt[wtdma]; - //hwwrite(vortex->mmio, VORTEX_WTDMA_START + (wtdma << 2), sb << ((0x1f-(wtdma&0xf)*2))); - hwwrite(vortex->mmio, VORTEX_WTDMA_START + (wtdma << 2), - sb << ((0xf - (wtdma & 0xf)) * 2)); - dma->period_real = dma->period_virt = sb; -} - -static void -vortex_wtdma_setbuffers(vortex_t * vortex, int wtdma, - int psize, int count) -{ - stream_t *dma = &vortex->dma_wt[wtdma]; - - dma->period_bytes = psize; - dma->nr_periods = count; - - dma->cfg0 = 0; - dma->cfg1 = 0; - switch (count) { - /* Four or more pages */ - default: - case 4: - dma->cfg1 |= 0x88000000 | 0x44000000 | 0x30000000 | (psize-1); - hwwrite(vortex->mmio, VORTEX_WTDMA_BUFBASE + (wtdma << 4) + 0xc, - snd_pcm_sgbuf_get_addr(dma->substream, psize * 3)); - /* 3 pages */ - case 3: - dma->cfg0 |= 0x12000000; - dma->cfg1 |= 0x80000000 | 0x40000000 | ((psize-1) << 0xc); - hwwrite(vortex->mmio, VORTEX_WTDMA_BUFBASE + (wtdma << 4) + 0x8, - snd_pcm_sgbuf_get_addr(dma->substream, psize * 2)); - /* 2 pages */ - case 2: - dma->cfg0 |= 0x88000000 | 0x44000000 | 0x10000000 | (psize-1); - hwwrite(vortex->mmio, VORTEX_WTDMA_BUFBASE + (wtdma << 4) + 0x4, - snd_pcm_sgbuf_get_addr(dma->substream, psize)); - /* 1 page */ - case 1: - dma->cfg0 |= 0x80000000 | 0x40000000 | ((psize-1) << 0xc); - hwwrite(vortex->mmio, VORTEX_WTDMA_BUFBASE + (wtdma << 4), - snd_pcm_sgbuf_get_addr(dma->substream, 0)); - break; - } - hwwrite(vortex->mmio, VORTEX_WTDMA_BUFCFG0 + (wtdma << 3), dma->cfg0); - hwwrite(vortex->mmio, VORTEX_WTDMA_BUFCFG1 + (wtdma << 3), dma->cfg1); - - vortex_wtdma_setfirstbuffer(vortex, wtdma); - vortex_wtdma_setstartbuffer(vortex, wtdma, 0); -} - -static void -vortex_wtdma_setmode(vortex_t * vortex, int wtdma, int ie, int fmt, int d, - /*int e, */ u32 offset) -{ - stream_t *dma = &vortex->dma_wt[wtdma]; - - //dma->this_08 = e; - dma->dma_unknown = d; - dma->dma_ctrl = 0; - dma->dma_ctrl = - ((offset & OFFSET_MASK) | (dma->dma_ctrl & ~OFFSET_MASK)); - /* PCMOUT interrupt */ - dma->dma_ctrl = - (dma->dma_ctrl & ~IE_MASK) | ((ie << IE_SHIFT) & IE_MASK); - /* Always playback. */ - dma->dma_ctrl |= (1 << DIR_SHIFT); - /* Audio Format */ - dma->dma_ctrl = - (dma->dma_ctrl & FMT_MASK) | ((fmt << FMT_SHIFT) & FMT_MASK); - /* Write into hardware */ - hwwrite(vortex->mmio, VORTEX_WTDMA_CTRL + (wtdma << 2), dma->dma_ctrl); -} - -static int vortex_wtdma_bufshift(vortex_t * vortex, int wtdma) -{ - stream_t *dma = &vortex->dma_wt[wtdma]; - int page, p, pp, delta, i; - - page = - (hwread(vortex->mmio, VORTEX_WTDMA_STAT + (wtdma << 2)) & - WT_SUBBUF_MASK) - >> WT_SUBBUF_SHIFT; - if (dma->nr_periods >= 4) - delta = (page - dma->period_real) & 3; - else { - delta = (page - dma->period_real); - if (delta < 0) - delta += dma->nr_periods; - } - if (delta == 0) - return 0; - - /* refresh hw page table */ - if (dma->nr_periods > 4) { - for (i = 0; i < delta; i++) { - /* p: audio buffer page index */ - p = dma->period_virt + i + 4; - if (p >= dma->nr_periods) - p -= dma->nr_periods; - /* pp: hardware DMA page index. */ - pp = dma->period_real + i; - if (pp >= 4) - pp -= 4; - hwwrite(vortex->mmio, - VORTEX_WTDMA_BUFBASE + - (((wtdma << 2) + pp) << 2), - snd_pcm_sgbuf_get_addr(dma->substream, - dma->period_bytes * p)); - /* Force write thru cache. */ - hwread(vortex->mmio, VORTEX_WTDMA_BUFBASE + - (((wtdma << 2) + pp) << 2)); - } - } - dma->period_virt += delta; - if (dma->period_virt >= dma->nr_periods) - dma->period_virt -= dma->nr_periods; - dma->period_real = page; - - if (delta != 1) - printk(KERN_WARNING "vortex: wt virt = %d, delta = %d\n", - dma->period_virt, delta); - - return delta; -} - -#if 0 -static void -vortex_wtdma_getposition(vortex_t * vortex, int wtdma, int *subbuf, int *pos) -{ - int temp; - temp = hwread(vortex->mmio, VORTEX_WTDMA_STAT + (wtdma << 2)); - *subbuf = (temp >> WT_SUBBUF_SHIFT) & WT_SUBBUF_MASK; - *pos = temp & POS_MASK; -} - -static int vortex_wtdma_getcursubuffer(vortex_t * vortex, int wtdma) -{ - return ((hwread(vortex->mmio, VORTEX_WTDMA_STAT + (wtdma << 2)) >> - POS_SHIFT) & POS_MASK); -} -#endif -static inline int vortex_wtdma_getlinearpos(vortex_t * vortex, int wtdma) -{ - stream_t *dma = &vortex->dma_wt[wtdma]; - int temp; - - temp = hwread(vortex->mmio, VORTEX_WTDMA_STAT + (wtdma << 2)); - temp = (dma->period_virt * dma->period_bytes) + (temp & (dma->period_bytes - 1)); - return temp; -} - -static void vortex_wtdma_startfifo(vortex_t * vortex, int wtdma) -{ - stream_t *dma = &vortex->dma_wt[wtdma]; - int this_8 = 0, this_4 = 0; - - switch (dma->fifo_status) { - case FIFO_START: - vortex_fifo_setwtvalid(vortex, wtdma, - dma->fifo_enabled ? 1 : 0); - break; - case FIFO_STOP: - this_8 = 1; - hwwrite(vortex->mmio, VORTEX_WTDMA_CTRL + (wtdma << 2), - dma->dma_ctrl); - vortex_fifo_setwtctrl(vortex, wtdma, dma->dma_unknown, - this_4, this_8, - dma->fifo_enabled ? 1 : 0, 0); - break; - case FIFO_PAUSE: - vortex_fifo_setwtctrl(vortex, wtdma, dma->dma_unknown, - this_4, this_8, - dma->fifo_enabled ? 1 : 0, 0); - break; - } - dma->fifo_status = FIFO_START; -} - -static void vortex_wtdma_resumefifo(vortex_t * vortex, int wtdma) -{ - stream_t *dma = &vortex->dma_wt[wtdma]; - - int this_8 = 0, this_4 = 0; - switch (dma->fifo_status) { - case FIFO_STOP: - hwwrite(vortex->mmio, VORTEX_WTDMA_CTRL + (wtdma << 2), - dma->dma_ctrl); - vortex_fifo_setwtctrl(vortex, wtdma, dma->dma_unknown, - this_4, this_8, - dma->fifo_enabled ? 1 : 0, 0); - break; - case FIFO_PAUSE: - vortex_fifo_setwtctrl(vortex, wtdma, dma->dma_unknown, - this_4, this_8, - dma->fifo_enabled ? 1 : 0, 0); - break; - } - dma->fifo_status = FIFO_START; -} - -static void vortex_wtdma_pausefifo(vortex_t * vortex, int wtdma) -{ - stream_t *dma = &vortex->dma_wt[wtdma]; - - int this_8 = 0, this_4 = 0; - switch (dma->fifo_status) { - case FIFO_START: - vortex_fifo_setwtctrl(vortex, wtdma, dma->dma_unknown, - this_4, this_8, 0, 0); - break; - case FIFO_STOP: - hwwrite(vortex->mmio, VORTEX_WTDMA_CTRL + (wtdma << 2), - dma->dma_ctrl); - vortex_fifo_setwtctrl(vortex, wtdma, dma->dma_unknown, - this_4, this_8, 0, 0); - break; - } - dma->fifo_status = FIFO_PAUSE; -} - -static void vortex_wtdma_stopfifo(vortex_t * vortex, int wtdma) -{ - stream_t *dma = &vortex->dma_wt[wtdma]; - - int this_4 = 0, this_8 = 0; - if (dma->fifo_status == FIFO_START) - vortex_fifo_setwtctrl(vortex, wtdma, dma->dma_unknown, - this_4, this_8, 0, 0); - else if (dma->fifo_status == FIFO_STOP) - return; - dma->fifo_status = FIFO_STOP; - dma->fifo_enabled = 0; -} - -#endif -/* ADB Routes */ - -typedef int ADBRamLink; -static void vortex_adb_init(vortex_t * vortex) -{ - int i; - /* it looks like we are writing more than we need to... - * if we write what we are supposed to it breaks things... */ - hwwrite(vortex->mmio, VORTEX_ADB_SR, 0); - for (i = 0; i < VORTEX_ADB_RTBASE_COUNT; i++) - hwwrite(vortex->mmio, VORTEX_ADB_RTBASE + (i << 2), - hwread(vortex->mmio, - VORTEX_ADB_RTBASE + (i << 2)) | ROUTE_MASK); - for (i = 0; i < VORTEX_ADB_CHNBASE_COUNT; i++) { - hwwrite(vortex->mmio, VORTEX_ADB_CHNBASE + (i << 2), - hwread(vortex->mmio, - VORTEX_ADB_CHNBASE + (i << 2)) | ROUTE_MASK); - } -} - -static void vortex_adb_en_sr(vortex_t * vortex, int channel) -{ - hwwrite(vortex->mmio, VORTEX_ADB_SR, - hwread(vortex->mmio, VORTEX_ADB_SR) | (0x1 << channel)); -} - -static void vortex_adb_dis_sr(vortex_t * vortex, int channel) -{ - hwwrite(vortex->mmio, VORTEX_ADB_SR, - hwread(vortex->mmio, VORTEX_ADB_SR) & ~(0x1 << channel)); -} - -static void -vortex_adb_addroutes(vortex_t * vortex, unsigned char channel, - ADBRamLink * route, int rnum) -{ - int temp, prev, lifeboat = 0; - - if ((rnum <= 0) || (route == NULL)) - return; - /* Write last routes. */ - rnum--; - hwwrite(vortex->mmio, - VORTEX_ADB_RTBASE + ((route[rnum] & ADB_MASK) << 2), - ROUTE_MASK); - while (rnum > 0) { - hwwrite(vortex->mmio, - VORTEX_ADB_RTBASE + - ((route[rnum - 1] & ADB_MASK) << 2), route[rnum]); - rnum--; - } - /* Write first route. */ - temp = - hwread(vortex->mmio, - VORTEX_ADB_CHNBASE + (channel << 2)) & ADB_MASK; - if (temp == ADB_MASK) { - /* First entry on this channel. */ - hwwrite(vortex->mmio, VORTEX_ADB_CHNBASE + (channel << 2), - route[0]); - vortex_adb_en_sr(vortex, channel); - return; - } - /* Not first entry on this channel. Need to link. */ - do { - prev = temp; - temp = - hwread(vortex->mmio, - VORTEX_ADB_RTBASE + (temp << 2)) & ADB_MASK; - if ((lifeboat++) > ADB_MASK) { - printk(KERN_ERR - "vortex_adb_addroutes: unending route! 0x%x\n", - *route); - return; - } - } - while (temp != ADB_MASK); - hwwrite(vortex->mmio, VORTEX_ADB_RTBASE + (prev << 2), route[0]); -} - -static void -vortex_adb_delroutes(vortex_t * vortex, unsigned char channel, - ADBRamLink route0, ADBRamLink route1) -{ - int temp, lifeboat = 0, prev; - - /* Find route. */ - temp = - hwread(vortex->mmio, - VORTEX_ADB_CHNBASE + (channel << 2)) & ADB_MASK; - if (temp == (route0 & ADB_MASK)) { - temp = - hwread(vortex->mmio, - VORTEX_ADB_RTBASE + ((route1 & ADB_MASK) << 2)); - if ((temp & ADB_MASK) == ADB_MASK) - vortex_adb_dis_sr(vortex, channel); - hwwrite(vortex->mmio, VORTEX_ADB_CHNBASE + (channel << 2), - temp); - return; - } - do { - prev = temp; - temp = - hwread(vortex->mmio, - VORTEX_ADB_RTBASE + (prev << 2)) & ADB_MASK; - if (((lifeboat++) > ADB_MASK) || (temp == ADB_MASK)) { - printk(KERN_ERR - "vortex_adb_delroutes: route not found! 0x%x\n", - route0); - return; - } - } - while (temp != (route0 & ADB_MASK)); - temp = hwread(vortex->mmio, VORTEX_ADB_RTBASE + (temp << 2)); - if ((temp & ADB_MASK) == route1) - temp = hwread(vortex->mmio, VORTEX_ADB_RTBASE + (temp << 2)); - /* Make bridge over deleted route. */ - hwwrite(vortex->mmio, VORTEX_ADB_RTBASE + (prev << 2), temp); -} - -static void -vortex_route(vortex_t * vortex, int en, unsigned char channel, - unsigned char source, unsigned char dest) -{ - ADBRamLink route; - - route = ((source & ADB_MASK) << ADB_SHIFT) | (dest & ADB_MASK); - if (en) { - vortex_adb_addroutes(vortex, channel, &route, 1); - if ((source < (OFFSET_SRCOUT + NR_SRC)) - && (source >= OFFSET_SRCOUT)) - vortex_src_addWTD(vortex, (source - OFFSET_SRCOUT), - channel); - else if ((source < (OFFSET_MIXOUT + NR_MIXOUT)) - && (source >= OFFSET_MIXOUT)) - vortex_mixer_addWTD(vortex, - (source - OFFSET_MIXOUT), channel); - } else { - vortex_adb_delroutes(vortex, channel, route, route); - if ((source < (OFFSET_SRCOUT + NR_SRC)) - && (source >= OFFSET_SRCOUT)) - vortex_src_delWTD(vortex, (source - OFFSET_SRCOUT), - channel); - else if ((source < (OFFSET_MIXOUT + NR_MIXOUT)) - && (source >= OFFSET_MIXOUT)) - vortex_mixer_delWTD(vortex, - (source - OFFSET_MIXOUT), channel); - } -} - -#if 0 -static void -vortex_routes(vortex_t * vortex, int en, unsigned char channel, - unsigned char source, unsigned char dest0, unsigned char dest1) -{ - ADBRamLink route[2]; - - route[0] = ((source & ADB_MASK) << ADB_SHIFT) | (dest0 & ADB_MASK); - route[1] = ((source & ADB_MASK) << ADB_SHIFT) | (dest1 & ADB_MASK); - - if (en) { - vortex_adb_addroutes(vortex, channel, route, 2); - if ((source < (OFFSET_SRCOUT + NR_SRC)) - && (source >= (OFFSET_SRCOUT))) - vortex_src_addWTD(vortex, (source - OFFSET_SRCOUT), - channel); - else if ((source < (OFFSET_MIXOUT + NR_MIXOUT)) - && (source >= (OFFSET_MIXOUT))) - vortex_mixer_addWTD(vortex, - (source - OFFSET_MIXOUT), channel); - } else { - vortex_adb_delroutes(vortex, channel, route[0], route[1]); - if ((source < (OFFSET_SRCOUT + NR_SRC)) - && (source >= (OFFSET_SRCOUT))) - vortex_src_delWTD(vortex, (source - OFFSET_SRCOUT), - channel); - else if ((source < (OFFSET_MIXOUT + NR_MIXOUT)) - && (source >= (OFFSET_MIXOUT))) - vortex_mixer_delWTD(vortex, - (source - OFFSET_MIXOUT), channel); - } -} - -#endif -/* Route two sources to same target. Sources must be of same class !!! */ -static void -vortex_routeLRT(vortex_t * vortex, int en, unsigned char ch, - unsigned char source0, unsigned char source1, - unsigned char dest) -{ - ADBRamLink route[2]; - - route[0] = ((source0 & ADB_MASK) << ADB_SHIFT) | (dest & ADB_MASK); - route[1] = ((source1 & ADB_MASK) << ADB_SHIFT) | (dest & ADB_MASK); - - if (dest < 0x10) - route[1] = (route[1] & ~ADB_MASK) | (dest + 0x20); /* fifo A */ - - if (en) { - vortex_adb_addroutes(vortex, ch, route, 2); - if ((source0 < (OFFSET_SRCOUT + NR_SRC)) - && (source0 >= OFFSET_SRCOUT)) { - vortex_src_addWTD(vortex, - (source0 - OFFSET_SRCOUT), ch); - vortex_src_addWTD(vortex, - (source1 - OFFSET_SRCOUT), ch); - } else if ((source0 < (OFFSET_MIXOUT + NR_MIXOUT)) - && (source0 >= OFFSET_MIXOUT)) { - vortex_mixer_addWTD(vortex, - (source0 - OFFSET_MIXOUT), ch); - vortex_mixer_addWTD(vortex, - (source1 - OFFSET_MIXOUT), ch); - } - } else { - vortex_adb_delroutes(vortex, ch, route[0], route[1]); - if ((source0 < (OFFSET_SRCOUT + NR_SRC)) - && (source0 >= OFFSET_SRCOUT)) { - vortex_src_delWTD(vortex, - (source0 - OFFSET_SRCOUT), ch); - vortex_src_delWTD(vortex, - (source1 - OFFSET_SRCOUT), ch); - } else if ((source0 < (OFFSET_MIXOUT + NR_MIXOUT)) - && (source0 >= OFFSET_MIXOUT)) { - vortex_mixer_delWTD(vortex, - (source0 - OFFSET_MIXOUT), ch); - vortex_mixer_delWTD(vortex, - (source1 - OFFSET_MIXOUT), ch); - } - } -} - -/* Connection stuff */ - -// Connect adbdma to src('s). -static void -vortex_connection_adbdma_src(vortex_t * vortex, int en, unsigned char ch, - unsigned char adbdma, unsigned char src) -{ - vortex_route(vortex, en, ch, ADB_DMA(adbdma), ADB_SRCIN(src)); -} - -// Connect SRC to mixin. -static void -vortex_connection_src_mixin(vortex_t * vortex, int en, - unsigned char channel, unsigned char src, - unsigned char mixin) -{ - vortex_route(vortex, en, channel, ADB_SRCOUT(src), ADB_MIXIN(mixin)); -} - -// Connect mixin with mix output. -static void -vortex_connection_mixin_mix(vortex_t * vortex, int en, unsigned char mixin, - unsigned char mix, int a) -{ - if (en) { - vortex_mix_enableinput(vortex, mix, mixin); - vortex_mix_setinputvolumebyte(vortex, mix, mixin, MIX_DEFIGAIN); // added to original code. - } else - vortex_mix_disableinput(vortex, mix, mixin, a); -} - -// Connect absolut address to mixin. -static void -vortex_connection_adb_mixin(vortex_t * vortex, int en, - unsigned char channel, unsigned char source, - unsigned char mixin) -{ - vortex_route(vortex, en, channel, source, ADB_MIXIN(mixin)); -} - -static void -vortex_connection_src_adbdma(vortex_t * vortex, int en, unsigned char ch, - unsigned char src, unsigned char adbdma) -{ - vortex_route(vortex, en, ch, ADB_SRCOUT(src), ADB_DMA(adbdma)); -} - -static void -vortex_connection_src_src_adbdma(vortex_t * vortex, int en, - unsigned char ch, unsigned char src0, - unsigned char src1, unsigned char adbdma) -{ - - vortex_routeLRT(vortex, en, ch, ADB_SRCOUT(src0), ADB_SRCOUT(src1), - ADB_DMA(adbdma)); -} - -// mix to absolut address. -static void -vortex_connection_mix_adb(vortex_t * vortex, int en, unsigned char ch, - unsigned char mix, unsigned char dest) -{ - vortex_route(vortex, en, ch, ADB_MIXOUT(mix), dest); - vortex_mix_setvolumebyte(vortex, mix, MIX_DEFOGAIN); // added to original code. -} - -// mixer to src. -static void -vortex_connection_mix_src(vortex_t * vortex, int en, unsigned char ch, - unsigned char mix, unsigned char src) -{ - vortex_route(vortex, en, ch, ADB_MIXOUT(mix), ADB_SRCIN(src)); - vortex_mix_setvolumebyte(vortex, mix, MIX_DEFOGAIN); // added to original code. -} - -#if 0 -static void -vortex_connection_adbdma_src_src(vortex_t * vortex, int en, - unsigned char channel, - unsigned char adbdma, unsigned char src0, - unsigned char src1) -{ - vortex_routes(vortex, en, channel, ADB_DMA(adbdma), - ADB_SRCIN(src0), ADB_SRCIN(src1)); -} - -// Connect two mix to AdbDma. -static void -vortex_connection_mix_mix_adbdma(vortex_t * vortex, int en, - unsigned char ch, unsigned char mix0, - unsigned char mix1, unsigned char adbdma) -{ - - ADBRamLink routes[2]; - routes[0] = - (((mix0 + - OFFSET_MIXOUT) & ADB_MASK) << ADB_SHIFT) | (adbdma & ADB_MASK); - routes[1] = - (((mix1 + OFFSET_MIXOUT) & ADB_MASK) << ADB_SHIFT) | ((adbdma + - 0x20) & - ADB_MASK); - if (en) { - vortex_adb_addroutes(vortex, ch, routes, 0x2); - vortex_mixer_addWTD(vortex, mix0, ch); - vortex_mixer_addWTD(vortex, mix1, ch); - } else { - vortex_adb_delroutes(vortex, ch, routes[0], routes[1]); - vortex_mixer_delWTD(vortex, mix0, ch); - vortex_mixer_delWTD(vortex, mix1, ch); - } -} -#endif - -/* CODEC connect. */ - -static void -vortex_connect_codecplay(vortex_t * vortex, int en, unsigned char mixers[]) -{ -#ifdef CHIP_AU8820 - vortex_connection_mix_adb(vortex, en, 0x11, mixers[0], ADB_CODECOUT(0)); - vortex_connection_mix_adb(vortex, en, 0x11, mixers[1], ADB_CODECOUT(1)); -#else -#if 1 - // Connect front channels through EQ. - vortex_connection_mix_adb(vortex, en, 0x11, mixers[0], ADB_EQIN(0)); - vortex_connection_mix_adb(vortex, en, 0x11, mixers[1], ADB_EQIN(1)); - /* Lower volume, since EQ has some gain. */ - vortex_mix_setvolumebyte(vortex, mixers[0], 0); - vortex_mix_setvolumebyte(vortex, mixers[1], 0); - vortex_route(vortex, en, 0x11, ADB_EQOUT(0), ADB_CODECOUT(0)); - vortex_route(vortex, en, 0x11, ADB_EQOUT(1), ADB_CODECOUT(1)); - - /* Check if reg 0x28 has SDAC bit set. */ - if (VORTEX_IS_QUAD(vortex)) { - /* Rear channel. Note: ADB_CODECOUT(0+2) and (1+2) is for AC97 modem */ - vortex_connection_mix_adb(vortex, en, 0x11, mixers[2], - ADB_CODECOUT(0 + 4)); - vortex_connection_mix_adb(vortex, en, 0x11, mixers[3], - ADB_CODECOUT(1 + 4)); - /* printk(KERN_DEBUG "SDAC detected "); */ - } -#else - // Use plain direct output to codec. - vortex_connection_mix_adb(vortex, en, 0x11, mixers[0], ADB_CODECOUT(0)); - vortex_connection_mix_adb(vortex, en, 0x11, mixers[1], ADB_CODECOUT(1)); -#endif -#endif -} - -static void -vortex_connect_codecrec(vortex_t * vortex, int en, unsigned char mixin0, - unsigned char mixin1) -{ - /* - Enable: 0x1, 0x1 - Channel: 0x11, 0x11 - ADB Source address: 0x48, 0x49 - Destination Asp4Topology_0x9c,0x98 - */ - vortex_connection_adb_mixin(vortex, en, 0x11, ADB_CODECIN(0), mixin0); - vortex_connection_adb_mixin(vortex, en, 0x11, ADB_CODECIN(1), mixin1); -} - -// Higher level ADB audio path (de)allocator. - -/* Resource manager */ -static int resnum[VORTEX_RESOURCE_LAST] = - { NR_ADB, NR_SRC, NR_MIXIN, NR_MIXOUT, NR_A3D }; -/* - Checkout/Checkin resource of given type. - resmap: resource map to be used. If NULL means that we want to allocate - a DMA resource (root of all other resources of a dma channel). - out: Mean checkout if != 0. Else mean Checkin resource. - restype: Indicates type of resource to be checked in or out. -*/ -static char -vortex_adb_checkinout(vortex_t * vortex, int resmap[], int out, int restype) -{ - int i, qty = resnum[restype], resinuse = 0; - - if (out) { - /* Gather used resources by all streams. */ - for (i = 0; i < NR_ADB; i++) { - resinuse |= vortex->dma_adb[i].resources[restype]; - } - resinuse |= vortex->fixed_res[restype]; - /* Find and take free resource. */ - for (i = 0; i < qty; i++) { - if ((resinuse & (1 << i)) == 0) { - if (resmap != NULL) - resmap[restype] |= (1 << i); - else - vortex->dma_adb[i].resources[restype] |= (1 << i); - /* - printk(KERN_DEBUG - "vortex: ResManager: type %d out %d\n", - restype, i); - */ - return i; - } - } - } else { - if (resmap == NULL) - return -EINVAL; - /* Checkin first resource of type restype. */ - for (i = 0; i < qty; i++) { - if (resmap[restype] & (1 << i)) { - resmap[restype] &= ~(1 << i); - /* - printk(KERN_DEBUG - "vortex: ResManager: type %d in %d\n", - restype, i); - */ - return i; - } - } - } - printk(KERN_ERR "vortex: FATAL: ResManager: resource type %d exhausted.\n", restype); - return -ENOMEM; -} - -/* Default Connections */ - -static void vortex_connect_default(vortex_t * vortex, int en) -{ - // Connect AC97 codec. - vortex->mixplayb[0] = vortex_adb_checkinout(vortex, vortex->fixed_res, en, - VORTEX_RESOURCE_MIXOUT); - vortex->mixplayb[1] = vortex_adb_checkinout(vortex, vortex->fixed_res, en, - VORTEX_RESOURCE_MIXOUT); - if (VORTEX_IS_QUAD(vortex)) { - vortex->mixplayb[2] = vortex_adb_checkinout(vortex, vortex->fixed_res, en, - VORTEX_RESOURCE_MIXOUT); - vortex->mixplayb[3] = vortex_adb_checkinout(vortex, vortex->fixed_res, en, - VORTEX_RESOURCE_MIXOUT); - } - vortex_connect_codecplay(vortex, en, vortex->mixplayb); - - vortex->mixcapt[0] = vortex_adb_checkinout(vortex, vortex->fixed_res, en, - VORTEX_RESOURCE_MIXIN); - vortex->mixcapt[1] = vortex_adb_checkinout(vortex, vortex->fixed_res, en, - VORTEX_RESOURCE_MIXIN); - vortex_connect_codecrec(vortex, en, MIX_CAPT(0), MIX_CAPT(1)); - - // Connect SPDIF -#ifndef CHIP_AU8820 - vortex->mixspdif[0] = vortex_adb_checkinout(vortex, vortex->fixed_res, en, - VORTEX_RESOURCE_MIXOUT); - vortex->mixspdif[1] = vortex_adb_checkinout(vortex, vortex->fixed_res, en, - VORTEX_RESOURCE_MIXOUT); - vortex_connection_mix_adb(vortex, en, 0x14, vortex->mixspdif[0], - ADB_SPDIFOUT(0)); - vortex_connection_mix_adb(vortex, en, 0x14, vortex->mixspdif[1], - ADB_SPDIFOUT(1)); -#endif - // Connect WT -#ifndef CHIP_AU8810 - vortex_wt_connect(vortex, en); -#endif - // A3D (crosstalk canceler and A3D slices). AU8810 disabled for now. -#ifndef CHIP_AU8820 - vortex_Vort3D_connect(vortex, en); -#endif - // Connect I2S - - // Connect DSP interface for SQ3500 turbo (not here i think...) - - // Connect AC98 modem codec - -} - -/* - Allocate nr_ch pcm audio routes if dma < 0. If dma >= 0, existing routes - are deallocated. - dma: DMA engine routes to be deallocated when dma >= 0. - nr_ch: Number of channels to be de/allocated. - dir: direction of stream. Uses same values as substream->stream. - type: Type of audio output/source (codec, spdif, i2s, dsp, etc) - Return: Return allocated DMA or same DMA passed as "dma" when dma >= 0. -*/ -static int -vortex_adb_allocroute(vortex_t *vortex, int dma, int nr_ch, int dir, - int type, int subdev) -{ - stream_t *stream; - int i, en; - struct pcm_vol *p; - - if (dma >= 0) { - en = 0; - vortex_adb_checkinout(vortex, - vortex->dma_adb[dma].resources, en, - VORTEX_RESOURCE_DMA); - } else { - en = 1; - if ((dma = - vortex_adb_checkinout(vortex, NULL, en, - VORTEX_RESOURCE_DMA)) < 0) - return -EBUSY; - } - - stream = &vortex->dma_adb[dma]; - stream->dma = dma; - stream->dir = dir; - stream->type = type; - - /* PLAYBACK ROUTES. */ - if (dir == SNDRV_PCM_STREAM_PLAYBACK) { - int src[4], mix[4], ch_top; -#ifndef CHIP_AU8820 - int a3d = 0; -#endif - /* Get SRC and MIXER hardware resources. */ - if (stream->type != VORTEX_PCM_SPDIF) { - for (i = 0; i < nr_ch; i++) { - if ((src[i] = vortex_adb_checkinout(vortex, - stream->resources, en, - VORTEX_RESOURCE_SRC)) < 0) { - memset(stream->resources, 0, - sizeof(unsigned char) * - VORTEX_RESOURCE_LAST); - return -EBUSY; - } - if (stream->type != VORTEX_PCM_A3D) { - if ((mix[i] = vortex_adb_checkinout(vortex, - stream->resources, - en, - VORTEX_RESOURCE_MIXIN)) < 0) { - memset(stream->resources, - 0, - sizeof(unsigned char) * VORTEX_RESOURCE_LAST); - return -EBUSY; - } - } - } - } -#ifndef CHIP_AU8820 - if (stream->type == VORTEX_PCM_A3D) { - if ((a3d = - vortex_adb_checkinout(vortex, - stream->resources, en, - VORTEX_RESOURCE_A3D)) < 0) { - memset(stream->resources, 0, - sizeof(unsigned char) * - VORTEX_RESOURCE_LAST); - printk(KERN_ERR "vortex: out of A3D sources. Sorry\n"); - return -EBUSY; - } - /* (De)Initialize A3D hardware source. */ - vortex_Vort3D_InitializeSource(&(vortex->a3d[a3d]), en); - } - /* Make SPDIF out exclusive to "spdif" device when in use. */ - if ((stream->type == VORTEX_PCM_SPDIF) && (en)) { - vortex_route(vortex, 0, 0x14, - ADB_MIXOUT(vortex->mixspdif[0]), - ADB_SPDIFOUT(0)); - vortex_route(vortex, 0, 0x14, - ADB_MIXOUT(vortex->mixspdif[1]), - ADB_SPDIFOUT(1)); - } -#endif - /* Make playback routes. */ - for (i = 0; i < nr_ch; i++) { - if (stream->type == VORTEX_PCM_ADB) { - vortex_connection_adbdma_src(vortex, en, - src[nr_ch - 1], - dma, - src[i]); - vortex_connection_src_mixin(vortex, en, - 0x11, src[i], - mix[i]); - vortex_connection_mixin_mix(vortex, en, - mix[i], - MIX_PLAYB(i), 0); -#ifndef CHIP_AU8820 - vortex_connection_mixin_mix(vortex, en, - mix[i], - MIX_SPDIF(i % 2), 0); - vortex_mix_setinputvolumebyte(vortex, - MIX_SPDIF(i % 2), - mix[i], - MIX_DEFIGAIN); -#endif - } -#ifndef CHIP_AU8820 - if (stream->type == VORTEX_PCM_A3D) { - vortex_connection_adbdma_src(vortex, en, - src[nr_ch - 1], - dma, - src[i]); - vortex_route(vortex, en, 0x11, ADB_SRCOUT(src[i]), ADB_A3DIN(a3d)); - /* XTalk test. */ - //vortex_route(vortex, en, 0x11, dma, ADB_XTALKIN(i?9:4)); - //vortex_route(vortex, en, 0x11, ADB_SRCOUT(src[i]), ADB_XTALKIN(i?4:9)); - } - if (stream->type == VORTEX_PCM_SPDIF) - vortex_route(vortex, en, 0x14, - ADB_DMA(stream->dma), - ADB_SPDIFOUT(i)); -#endif - } - if (stream->type != VORTEX_PCM_SPDIF && stream->type != VORTEX_PCM_A3D) { - ch_top = (VORTEX_IS_QUAD(vortex) ? 4 : 2); - for (i = nr_ch; i < ch_top; i++) { - vortex_connection_mixin_mix(vortex, en, - mix[i % nr_ch], - MIX_PLAYB(i), 0); -#ifndef CHIP_AU8820 - vortex_connection_mixin_mix(vortex, en, - mix[i % nr_ch], - MIX_SPDIF(i % 2), - 0); - vortex_mix_setinputvolumebyte(vortex, - MIX_SPDIF(i % 2), - mix[i % nr_ch], - MIX_DEFIGAIN); -#endif - } - if (stream->type == VORTEX_PCM_ADB && en) { - p = &vortex->pcm_vol[subdev]; - p->dma = dma; - for (i = 0; i < nr_ch; i++) - p->mixin[i] = mix[i]; - for (i = 0; i < ch_top; i++) - p->vol[i] = 0; - } - } -#ifndef CHIP_AU8820 - else { - if (nr_ch == 1 && stream->type == VORTEX_PCM_SPDIF) - vortex_route(vortex, en, 0x14, - ADB_DMA(stream->dma), - ADB_SPDIFOUT(1)); - } - /* Reconnect SPDIF out when "spdif" device is down. */ - if ((stream->type == VORTEX_PCM_SPDIF) && (!en)) { - vortex_route(vortex, 1, 0x14, - ADB_MIXOUT(vortex->mixspdif[0]), - ADB_SPDIFOUT(0)); - vortex_route(vortex, 1, 0x14, - ADB_MIXOUT(vortex->mixspdif[1]), - ADB_SPDIFOUT(1)); - } -#endif - /* CAPTURE ROUTES. */ - } else { - int src[2], mix[2]; - - /* Get SRC and MIXER hardware resources. */ - for (i = 0; i < nr_ch; i++) { - if ((mix[i] = - vortex_adb_checkinout(vortex, - stream->resources, en, - VORTEX_RESOURCE_MIXOUT)) - < 0) { - memset(stream->resources, 0, - sizeof(unsigned char) * - VORTEX_RESOURCE_LAST); - return -EBUSY; - } - if ((src[i] = - vortex_adb_checkinout(vortex, - stream->resources, en, - VORTEX_RESOURCE_SRC)) < 0) { - memset(stream->resources, 0, - sizeof(unsigned char) * - VORTEX_RESOURCE_LAST); - return -EBUSY; - } - } - - /* Make capture routes. */ - vortex_connection_mixin_mix(vortex, en, MIX_CAPT(0), mix[0], 0); - vortex_connection_mix_src(vortex, en, 0x11, mix[0], src[0]); - if (nr_ch == 1) { - vortex_connection_mixin_mix(vortex, en, - MIX_CAPT(1), mix[0], 0); - vortex_connection_src_adbdma(vortex, en, - src[0], - src[0], dma); - } else { - vortex_connection_mixin_mix(vortex, en, - MIX_CAPT(1), mix[1], 0); - vortex_connection_mix_src(vortex, en, 0x11, mix[1], - src[1]); - vortex_connection_src_src_adbdma(vortex, en, - src[1], src[0], - src[1], dma); - } - } - vortex->dma_adb[dma].nr_ch = nr_ch; - -#if 0 - /* AC97 Codec channel setup. FIXME: this has no effect on some cards !! */ - if (nr_ch < 4) { - /* Copy stereo to rear channel (surround) */ - snd_ac97_write_cache(vortex->codec, - AC97_SIGMATEL_DAC2INVERT, - snd_ac97_read(vortex->codec, - AC97_SIGMATEL_DAC2INVERT) - | 4); - } else { - /* Allow separate front and rear channels. */ - snd_ac97_write_cache(vortex->codec, - AC97_SIGMATEL_DAC2INVERT, - snd_ac97_read(vortex->codec, - AC97_SIGMATEL_DAC2INVERT) - & ~((u32) - 4)); - } -#endif - return dma; -} - -/* - Set the SampleRate of the SRC's attached to the given DMA engine. - */ -static void -vortex_adb_setsrc(vortex_t * vortex, int adbdma, unsigned int rate, int dir) -{ - stream_t *stream = &(vortex->dma_adb[adbdma]); - int i, cvrt; - - /* dir=1:play ; dir=0:rec */ - if (dir) - cvrt = SRC_RATIO(rate, 48000); - else - cvrt = SRC_RATIO(48000, rate); - - /* Setup SRC's */ - for (i = 0; i < NR_SRC; i++) { - if (stream->resources[VORTEX_RESOURCE_SRC] & (1 << i)) - vortex_src_setupchannel(vortex, i, cvrt, 0, 0, i, dir, 1, cvrt, dir); - } -} - -// Timer and ISR functions. - -static void vortex_settimer(vortex_t * vortex, int period) -{ - //set the timer period to <period> 48000ths of a second. - hwwrite(vortex->mmio, VORTEX_IRQ_STAT, period); -} - -#if 0 -static void vortex_enable_timer_int(vortex_t * card) -{ - hwwrite(card->mmio, VORTEX_IRQ_CTRL, - hwread(card->mmio, VORTEX_IRQ_CTRL) | IRQ_TIMER | 0x60); -} - -static void vortex_disable_timer_int(vortex_t * card) -{ - hwwrite(card->mmio, VORTEX_IRQ_CTRL, - hwread(card->mmio, VORTEX_IRQ_CTRL) & ~IRQ_TIMER); -} - -#endif -static void vortex_enable_int(vortex_t * card) -{ - // CAsp4ISR__EnableVortexInt_void_ - hwwrite(card->mmio, VORTEX_CTRL, - hwread(card->mmio, VORTEX_CTRL) | CTRL_IRQ_ENABLE); - hwwrite(card->mmio, VORTEX_IRQ_CTRL, - (hwread(card->mmio, VORTEX_IRQ_CTRL) & 0xffffefc0) | 0x24); -} - -static void vortex_disable_int(vortex_t * card) -{ - hwwrite(card->mmio, VORTEX_CTRL, - hwread(card->mmio, VORTEX_CTRL) & ~CTRL_IRQ_ENABLE); -} - -static irqreturn_t vortex_interrupt(int irq, void *dev_id) -{ - vortex_t *vortex = dev_id; - int i, handled; - u32 source; - - //check if the interrupt is ours. - if (!(hwread(vortex->mmio, VORTEX_STAT) & 0x1)) - return IRQ_NONE; - - // This is the Interrupt Enable flag we set before (consistency check). - if (!(hwread(vortex->mmio, VORTEX_CTRL) & CTRL_IRQ_ENABLE)) - return IRQ_NONE; - - source = hwread(vortex->mmio, VORTEX_IRQ_SOURCE); - // Reset IRQ flags. - hwwrite(vortex->mmio, VORTEX_IRQ_SOURCE, source); - hwread(vortex->mmio, VORTEX_IRQ_SOURCE); - // Is at least one IRQ flag set? - if (source == 0) { - printk(KERN_ERR "vortex: missing irq source\n"); - return IRQ_NONE; - } - - handled = 0; - // Attend every interrupt source. - if (unlikely(source & IRQ_ERR_MASK)) { - if (source & IRQ_FATAL) { - printk(KERN_ERR "vortex: IRQ fatal error\n"); - } - if (source & IRQ_PARITY) { - printk(KERN_ERR "vortex: IRQ parity error\n"); - } - if (source & IRQ_REG) { - printk(KERN_ERR "vortex: IRQ reg error\n"); - } - if (source & IRQ_FIFO) { - printk(KERN_ERR "vortex: IRQ fifo error\n"); - } - if (source & IRQ_DMA) { - printk(KERN_ERR "vortex: IRQ dma error\n"); - } - handled = 1; - } - if (source & IRQ_PCMOUT) { - /* ALSA period acknowledge. */ - spin_lock(&vortex->lock); - for (i = 0; i < NR_ADB; i++) { - if (vortex->dma_adb[i].fifo_status == FIFO_START) { - if (!vortex_adbdma_bufshift(vortex, i)) - continue; - spin_unlock(&vortex->lock); - snd_pcm_period_elapsed(vortex->dma_adb[i]. - substream); - spin_lock(&vortex->lock); - } - } -#ifndef CHIP_AU8810 - for (i = 0; i < NR_WT; i++) { - if (vortex->dma_wt[i].fifo_status == FIFO_START) { - if (vortex_wtdma_bufshift(vortex, i)) ; - spin_unlock(&vortex->lock); - snd_pcm_period_elapsed(vortex->dma_wt[i]. - substream); - spin_lock(&vortex->lock); - } - } -#endif - spin_unlock(&vortex->lock); - handled = 1; - } - //Acknowledge the Timer interrupt - if (source & IRQ_TIMER) { - hwread(vortex->mmio, VORTEX_IRQ_STAT); - handled = 1; - } - if ((source & IRQ_MIDI) && vortex->rmidi) { - snd_mpu401_uart_interrupt(vortex->irq, - vortex->rmidi->private_data); - handled = 1; - } - - if (!handled) { - printk(KERN_ERR "vortex: unknown irq source %x\n", source); - } - return IRQ_RETVAL(handled); -} - -/* Codec */ - -#define POLL_COUNT 1000 -static void vortex_codec_init(vortex_t * vortex) -{ - int i; - - for (i = 0; i < 32; i++) { - /* the windows driver writes -i, so we write -i */ - hwwrite(vortex->mmio, (VORTEX_CODEC_CHN + (i << 2)), -i); - msleep(2); - } - if (0) { - hwwrite(vortex->mmio, VORTEX_CODEC_CTRL, 0x8068); - msleep(1); - hwwrite(vortex->mmio, VORTEX_CODEC_CTRL, 0x00e8); - msleep(1); - } else { - hwwrite(vortex->mmio, VORTEX_CODEC_CTRL, 0x00a8); - msleep(2); - hwwrite(vortex->mmio, VORTEX_CODEC_CTRL, 0x80a8); - msleep(2); - hwwrite(vortex->mmio, VORTEX_CODEC_CTRL, 0x80e8); - msleep(2); - hwwrite(vortex->mmio, VORTEX_CODEC_CTRL, 0x80a8); - msleep(2); - hwwrite(vortex->mmio, VORTEX_CODEC_CTRL, 0x00a8); - msleep(2); - hwwrite(vortex->mmio, VORTEX_CODEC_CTRL, 0x00e8); - } - for (i = 0; i < 32; i++) { - hwwrite(vortex->mmio, (VORTEX_CODEC_CHN + (i << 2)), -i); - msleep(5); - } - hwwrite(vortex->mmio, VORTEX_CODEC_CTRL, 0xe8); - msleep(1); - /* Enable codec channels 0 and 1. */ - hwwrite(vortex->mmio, VORTEX_CODEC_EN, - hwread(vortex->mmio, VORTEX_CODEC_EN) | EN_CODEC); -} - -static void -vortex_codec_write(struct snd_ac97 * codec, unsigned short addr, unsigned short data) -{ - - vortex_t *card = (vortex_t *) codec->private_data; - unsigned int lifeboat = 0; - - /* wait for transactions to clear */ - while (!(hwread(card->mmio, VORTEX_CODEC_CTRL) & 0x100)) { - udelay(100); - if (lifeboat++ > POLL_COUNT) { - printk(KERN_ERR "vortex: ac97 codec stuck busy\n"); - return; - } - } - /* write register */ - hwwrite(card->mmio, VORTEX_CODEC_IO, - ((addr << VORTEX_CODEC_ADDSHIFT) & VORTEX_CODEC_ADDMASK) | - ((data << VORTEX_CODEC_DATSHIFT) & VORTEX_CODEC_DATMASK) | - VORTEX_CODEC_WRITE | - (codec->num << VORTEX_CODEC_ID_SHIFT) ); - - /* Flush Caches. */ - hwread(card->mmio, VORTEX_CODEC_IO); -} - -static unsigned short vortex_codec_read(struct snd_ac97 * codec, unsigned short addr) -{ - - vortex_t *card = (vortex_t *) codec->private_data; - u32 read_addr, data; - unsigned lifeboat = 0; - - /* wait for transactions to clear */ - while (!(hwread(card->mmio, VORTEX_CODEC_CTRL) & 0x100)) { - udelay(100); - if (lifeboat++ > POLL_COUNT) { - printk(KERN_ERR "vortex: ac97 codec stuck busy\n"); - return 0xffff; - } - } - /* set up read address */ - read_addr = ((addr << VORTEX_CODEC_ADDSHIFT) & VORTEX_CODEC_ADDMASK) | - (codec->num << VORTEX_CODEC_ID_SHIFT) ; - hwwrite(card->mmio, VORTEX_CODEC_IO, read_addr); - - /* wait for address */ - do { - udelay(100); - data = hwread(card->mmio, VORTEX_CODEC_IO); - if (lifeboat++ > POLL_COUNT) { - printk(KERN_ERR "vortex: ac97 address never arrived\n"); - return 0xffff; - } - } while ((data & VORTEX_CODEC_ADDMASK) != - (addr << VORTEX_CODEC_ADDSHIFT)); - - /* return data. */ - return (u16) (data & VORTEX_CODEC_DATMASK); -} - -/* SPDIF support */ - -static void vortex_spdif_init(vortex_t * vortex, int spdif_sr, int spdif_mode) -{ - int i, this_38 = 0, this_04 = 0, this_08 = 0, this_0c = 0; - - /* CAsp4Spdif::InitializeSpdifHardware(void) */ - hwwrite(vortex->mmio, VORTEX_SPDIF_FLAGS, - hwread(vortex->mmio, VORTEX_SPDIF_FLAGS) & 0xfff3fffd); - //for (i=0x291D4; i<0x29200; i+=4) - for (i = 0; i < 11; i++) - hwwrite(vortex->mmio, VORTEX_SPDIF_CFG1 + (i << 2), 0); - //hwwrite(vortex->mmio, 0x29190, hwread(vortex->mmio, 0x29190) | 0xc0000); - hwwrite(vortex->mmio, VORTEX_CODEC_EN, - hwread(vortex->mmio, VORTEX_CODEC_EN) | EN_SPDIF); - - /* CAsp4Spdif::ProgramSRCInHardware(enum SPDIF_SR,enum SPDIFMODE) */ - if (this_04 && this_08) { - int edi; - - i = (((0x5DC00000 / spdif_sr) + 1) >> 1); - if (i > 0x800) { - if (i < 0x1ffff) - edi = (i >> 1); - else - edi = 0x1ffff; - } else { - i = edi = 0x800; - } - /* this_04 and this_08 are the CASp4Src's (samplerate converters) */ - vortex_src_setupchannel(vortex, this_04, edi, 0, 1, - this_0c, 1, 0, edi, 1); - vortex_src_setupchannel(vortex, this_08, edi, 0, 1, - this_0c, 1, 0, edi, 1); - } - - i = spdif_sr; - spdif_sr |= 0x8c; - switch (i) { - case 32000: - this_38 &= 0xFFFFFFFE; - this_38 &= 0xFFFFFFFD; - this_38 &= 0xF3FFFFFF; - this_38 |= 0x03000000; /* set 32khz samplerate */ - this_38 &= 0xFFFFFF3F; - spdif_sr &= 0xFFFFFFFD; - spdif_sr |= 1; - break; - case 44100: - this_38 &= 0xFFFFFFFE; - this_38 &= 0xFFFFFFFD; - this_38 &= 0xF0FFFFFF; - this_38 |= 0x03000000; - this_38 &= 0xFFFFFF3F; - spdif_sr &= 0xFFFFFFFC; - break; - case 48000: - if (spdif_mode == 1) { - this_38 &= 0xFFFFFFFE; - this_38 &= 0xFFFFFFFD; - this_38 &= 0xF2FFFFFF; - this_38 |= 0x02000000; /* set 48khz samplerate */ - this_38 &= 0xFFFFFF3F; - } else { - /* J. Gordon Wolfe: I think this stuff is for AC3 */ - this_38 |= 0x00000003; - this_38 &= 0xFFFFFFBF; - this_38 |= 0x80; - } - spdif_sr |= 2; - spdif_sr &= 0xFFFFFFFE; - break; - - } - /* looks like the next 2 lines transfer a 16-bit value into 2 8-bit - registers. seems to be for the standard IEC/SPDIF initialization - stuff */ - hwwrite(vortex->mmio, VORTEX_SPDIF_CFG0, this_38 & 0xffff); - hwwrite(vortex->mmio, VORTEX_SPDIF_CFG1, this_38 >> 0x10); - hwwrite(vortex->mmio, VORTEX_SPDIF_SMPRATE, spdif_sr); -} - -/* Initialization */ - -static int __devinit vortex_core_init(vortex_t * vortex) -{ - - printk(KERN_INFO "Vortex: init.... "); - /* Hardware Init. */ - hwwrite(vortex->mmio, VORTEX_CTRL, 0xffffffff); - msleep(5); - hwwrite(vortex->mmio, VORTEX_CTRL, - hwread(vortex->mmio, VORTEX_CTRL) & 0xffdfffff); - msleep(5); - /* Reset IRQ flags */ - hwwrite(vortex->mmio, VORTEX_IRQ_SOURCE, 0xffffffff); - hwread(vortex->mmio, VORTEX_IRQ_STAT); - - vortex_codec_init(vortex); - -#ifdef CHIP_AU8830 - hwwrite(vortex->mmio, VORTEX_CTRL, - hwread(vortex->mmio, VORTEX_CTRL) | 0x1000000); -#endif - - /* Init audio engine. */ - vortex_adbdma_init(vortex); - hwwrite(vortex->mmio, VORTEX_ENGINE_CTRL, 0x0); //, 0xc83c7e58, 0xc5f93e58 - vortex_adb_init(vortex); - /* Init processing blocks. */ - vortex_fifo_init(vortex); - vortex_mixer_init(vortex); - vortex_srcblock_init(vortex); -#ifndef CHIP_AU8820 - vortex_eq_init(vortex); - vortex_spdif_init(vortex, 48000, 1); - vortex_Vort3D_enable(vortex); -#endif -#ifndef CHIP_AU8810 - vortex_wt_init(vortex); -#endif - // Moved to au88x0.c - //vortex_connect_default(vortex, 1); - - vortex_settimer(vortex, 0x90); - // Enable Interrupts. - // vortex_enable_int() must be first !! - // hwwrite(vortex->mmio, VORTEX_IRQ_CTRL, 0); - // vortex_enable_int(vortex); - //vortex_enable_timer_int(vortex); - //vortex_disable_timer_int(vortex); - - printk(KERN_INFO "done.\n"); - spin_lock_init(&vortex->lock); - - return 0; -} - -static int vortex_core_shutdown(vortex_t * vortex) -{ - - printk(KERN_INFO "Vortex: shutdown..."); -#ifndef CHIP_AU8820 - vortex_eq_free(vortex); - vortex_Vort3D_disable(vortex); -#endif - //vortex_disable_timer_int(vortex); - vortex_disable_int(vortex); - vortex_connect_default(vortex, 0); - /* Reset all DMA fifos. */ - vortex_fifo_init(vortex); - /* Erase all audio routes. */ - vortex_adb_init(vortex); - - /* Disable MPU401 */ - //hwwrite(vortex->mmio, VORTEX_IRQ_CTRL, hwread(vortex->mmio, VORTEX_IRQ_CTRL) & ~IRQ_MIDI); - //hwwrite(vortex->mmio, VORTEX_CTRL, hwread(vortex->mmio, VORTEX_CTRL) & ~CTRL_MIDI_EN); - - hwwrite(vortex->mmio, VORTEX_IRQ_CTRL, 0); - hwwrite(vortex->mmio, VORTEX_CTRL, 0); - msleep(5); - hwwrite(vortex->mmio, VORTEX_IRQ_SOURCE, 0xffff); - - printk(KERN_INFO "done.\n"); - return 0; -} - -/* Alsa support. */ - -static int vortex_alsafmt_aspfmt(int alsafmt) -{ - int fmt; - - switch (alsafmt) { - case SNDRV_PCM_FORMAT_U8: - fmt = 0x1; - break; - case SNDRV_PCM_FORMAT_MU_LAW: - fmt = 0x2; - break; - case SNDRV_PCM_FORMAT_A_LAW: - fmt = 0x3; - break; - case SNDRV_PCM_FORMAT_SPECIAL: - fmt = 0x4; /* guess. */ - break; - case SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE: - fmt = 0x5; /* guess. */ - break; - case SNDRV_PCM_FORMAT_S16_LE: - fmt = 0x8; - break; - case SNDRV_PCM_FORMAT_S16_BE: - fmt = 0x9; /* check this... */ - break; - default: - fmt = 0x8; - printk(KERN_ERR "vortex: format unsupported %d\n", alsafmt); - break; - } - return fmt; -} - -/* Some not yet useful translations. */ -#if 0 -typedef enum { - ASPFMTLINEAR16 = 0, /* 0x8 */ - ASPFMTLINEAR8, /* 0x1 */ - ASPFMTULAW, /* 0x2 */ - ASPFMTALAW, /* 0x3 */ - ASPFMTSPORT, /* ? */ - ASPFMTSPDIF, /* ? */ -} ASPENCODING; - -static int -vortex_translateformat(vortex_t * vortex, char bits, char nch, int encod) -{ - int a, this_194; - - if ((bits != 8) && (bits != 16)) - return -1; - - switch (encod) { - case 0: - if (bits == 0x10) - a = 8; // 16 bit - break; - case 1: - if (bits == 8) - a = 1; // 8 bit - break; - case 2: - a = 2; // U_LAW - break; - case 3: - a = 3; // A_LAW - break; - } - switch (nch) { - case 1: - this_194 = 0; - break; - case 2: - this_194 = 1; - break; - case 4: - this_194 = 1; - break; - case 6: - this_194 = 1; - break; - } - return (a); -} - -static void vortex_cdmacore_setformat(vortex_t * vortex, int bits, int nch) -{ - short int d, this_148; - - d = ((bits >> 3) * nch); - this_148 = 0xbb80 / d; -} -#endif diff --git a/ANDROID_3.4.5/sound/pci/au88x0/au88x0_eq.c b/ANDROID_3.4.5/sound/pci/au88x0/au88x0_eq.c deleted file mode 100644 index 278ed818..00000000 --- a/ANDROID_3.4.5/sound/pci/au88x0/au88x0_eq.c +++ /dev/null @@ -1,929 +0,0 @@ -/*************************************************************************** - * au88x0_eq.c - * Aureal Vortex Hardware EQ control/access. - * - * Sun Jun 8 18:19:19 2003 - * 2003 Manuel Jander (mjander@users.sourceforge.net) - * - * 02 July 2003: First time something works :) - * November 2003: A3D Bypass code completed but untested. - * - * TODO: - * - Debug (testing) - * - Test peak visualization support. - * - ****************************************************************************/ - -/* - * 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 Library 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. - */ - -/* - The Aureal Hardware EQ is found on AU8810 and AU8830 chips only. - it has 4 inputs (2 for general mix, 2 for A3D) and 2 outputs (supposed - to be routed to the codec). -*/ - -#include "au88x0.h" -#include "au88x0_eq.h" -#include "au88x0_eqdata.c" - -#define VORTEX_EQ_BASE 0x2b000 -#define VORTEX_EQ_DEST (VORTEX_EQ_BASE + 0x410) -#define VORTEX_EQ_SOURCE (VORTEX_EQ_BASE + 0x430) -#define VORTEX_EQ_CTRL (VORTEX_EQ_BASE + 0x440) - -#define VORTEX_BAND_COEFF_SIZE 0x30 - -/* CEqHw.s */ -static void vortex_EqHw_SetTimeConsts(vortex_t * vortex, u16 gain, u16 level) -{ - hwwrite(vortex->mmio, 0x2b3c4, gain); - hwwrite(vortex->mmio, 0x2b3c8, level); -} - -static inline u16 sign_invert(u16 a) -{ - /* -(-32768) -> -32768 so we do -(-32768) -> 32767 to make the result positive */ - if (a == (u16)-32768) - return 32767; - else - return -a; -} - -static void vortex_EqHw_SetLeftCoefs(vortex_t * vortex, u16 coefs[]) -{ - eqhw_t *eqhw = &(vortex->eq.this04); - int i = 0, n /*esp2c */; - - for (n = 0; n < eqhw->this04; n++) { - hwwrite(vortex->mmio, 0x2b000 + n * 0x30, coefs[i + 0]); - hwwrite(vortex->mmio, 0x2b004 + n * 0x30, coefs[i + 1]); - - if (eqhw->this08 == 0) { - hwwrite(vortex->mmio, 0x2b008 + n * 0x30, coefs[i + 2]); - hwwrite(vortex->mmio, 0x2b00c + n * 0x30, coefs[i + 3]); - hwwrite(vortex->mmio, 0x2b010 + n * 0x30, coefs[i + 4]); - } else { - hwwrite(vortex->mmio, 0x2b008 + n * 0x30, sign_invert(coefs[2 + i])); - hwwrite(vortex->mmio, 0x2b00c + n * 0x30, sign_invert(coefs[3 + i])); - hwwrite(vortex->mmio, 0x2b010 + n * 0x30, sign_invert(coefs[4 + i])); - } - i += 5; - } -} - -static void vortex_EqHw_SetRightCoefs(vortex_t * vortex, u16 coefs[]) -{ - eqhw_t *eqhw = &(vortex->eq.this04); - int i = 0, n /*esp2c */; - - for (n = 0; n < eqhw->this04; n++) { - hwwrite(vortex->mmio, 0x2b1e0 + n * 0x30, coefs[0 + i]); - hwwrite(vortex->mmio, 0x2b1e4 + n * 0x30, coefs[1 + i]); - - if (eqhw->this08 == 0) { - hwwrite(vortex->mmio, 0x2b1e8 + n * 0x30, coefs[2 + i]); - hwwrite(vortex->mmio, 0x2b1ec + n * 0x30, coefs[3 + i]); - hwwrite(vortex->mmio, 0x2b1f0 + n * 0x30, coefs[4 + i]); - } else { - hwwrite(vortex->mmio, 0x2b1e8 + n * 0x30, sign_invert(coefs[2 + i])); - hwwrite(vortex->mmio, 0x2b1ec + n * 0x30, sign_invert(coefs[3 + i])); - hwwrite(vortex->mmio, 0x2b1f0 + n * 0x30, sign_invert(coefs[4 + i])); - } - i += 5; - } - -} - -static void vortex_EqHw_SetLeftStates(vortex_t * vortex, u16 a[], u16 b[]) -{ - eqhw_t *eqhw = &(vortex->eq.this04); - int i = 0, ebx; - - hwwrite(vortex->mmio, 0x2b3fc, a[0]); - hwwrite(vortex->mmio, 0x2b400, a[1]); - - for (ebx = 0; ebx < eqhw->this04; ebx++) { - hwwrite(vortex->mmio, 0x2b014 + (i * 0xc), b[i]); - hwwrite(vortex->mmio, 0x2b018 + (i * 0xc), b[1 + i]); - hwwrite(vortex->mmio, 0x2b01c + (i * 0xc), b[2 + i]); - hwwrite(vortex->mmio, 0x2b020 + (i * 0xc), b[3 + i]); - i += 4; - } -} - -static void vortex_EqHw_SetRightStates(vortex_t * vortex, u16 a[], u16 b[]) -{ - eqhw_t *eqhw = &(vortex->eq.this04); - int i = 0, ebx; - - hwwrite(vortex->mmio, 0x2b404, a[0]); - hwwrite(vortex->mmio, 0x2b408, a[1]); - - for (ebx = 0; ebx < eqhw->this04; ebx++) { - hwwrite(vortex->mmio, 0x2b1f4 + (i * 0xc), b[i]); - hwwrite(vortex->mmio, 0x2b1f8 + (i * 0xc), b[1 + i]); - hwwrite(vortex->mmio, 0x2b1fc + (i * 0xc), b[2 + i]); - hwwrite(vortex->mmio, 0x2b200 + (i * 0xc), b[3 + i]); - i += 4; - } -} - -#if 0 -static void vortex_EqHw_GetTimeConsts(vortex_t * vortex, u16 * a, u16 * b) -{ - *a = hwread(vortex->mmio, 0x2b3c4); - *b = hwread(vortex->mmio, 0x2b3c8); -} - -static void vortex_EqHw_GetLeftCoefs(vortex_t * vortex, u16 a[]) -{ - -} - -static void vortex_EqHw_GetRightCoefs(vortex_t * vortex, u16 a[]) -{ - -} - -static void vortex_EqHw_GetLeftStates(vortex_t * vortex, u16 * a, u16 b[]) -{ - -} - -static void vortex_EqHw_GetRightStates(vortex_t * vortex, u16 * a, u16 b[]) -{ - -} - -#endif -/* Mix Gains */ -static void vortex_EqHw_SetBypassGain(vortex_t * vortex, u16 a, u16 b) -{ - eqhw_t *eqhw = &(vortex->eq.this04); - if (eqhw->this08 == 0) { - hwwrite(vortex->mmio, 0x2b3d4, a); - hwwrite(vortex->mmio, 0x2b3ec, b); - } else { - hwwrite(vortex->mmio, 0x2b3d4, sign_invert(a)); - hwwrite(vortex->mmio, 0x2b3ec, sign_invert(b)); - } -} - -static void vortex_EqHw_SetA3DBypassGain(vortex_t * vortex, u16 a, u16 b) -{ - - hwwrite(vortex->mmio, 0x2b3e0, a); - hwwrite(vortex->mmio, 0x2b3f8, b); -} - -#if 0 -static void vortex_EqHw_SetCurrBypassGain(vortex_t * vortex, u16 a, u16 b) -{ - - hwwrite(vortex->mmio, 0x2b3d0, a); - hwwrite(vortex->mmio, 0x2b3e8, b); -} - -static void vortex_EqHw_SetCurrA3DBypassGain(vortex_t * vortex, u16 a, u16 b) -{ - - hwwrite(vortex->mmio, 0x2b3dc, a); - hwwrite(vortex->mmio, 0x2b3f4, b); -} - -#endif -static void -vortex_EqHw_SetLeftGainsSingleTarget(vortex_t * vortex, u16 index, u16 b) -{ - hwwrite(vortex->mmio, 0x2b02c + (index * 0x30), b); -} - -static void -vortex_EqHw_SetRightGainsSingleTarget(vortex_t * vortex, u16 index, u16 b) -{ - hwwrite(vortex->mmio, 0x2b20c + (index * 0x30), b); -} - -static void vortex_EqHw_SetLeftGainsTarget(vortex_t * vortex, u16 a[]) -{ - eqhw_t *eqhw = &(vortex->eq.this04); - int ebx; - - for (ebx = 0; ebx < eqhw->this04; ebx++) { - hwwrite(vortex->mmio, 0x2b02c + ebx * 0x30, a[ebx]); - } -} - -static void vortex_EqHw_SetRightGainsTarget(vortex_t * vortex, u16 a[]) -{ - eqhw_t *eqhw = &(vortex->eq.this04); - int ebx; - - for (ebx = 0; ebx < eqhw->this04; ebx++) { - hwwrite(vortex->mmio, 0x2b20c + ebx * 0x30, a[ebx]); - } -} - -static void vortex_EqHw_SetLeftGainsCurrent(vortex_t * vortex, u16 a[]) -{ - eqhw_t *eqhw = &(vortex->eq.this04); - int ebx; - - for (ebx = 0; ebx < eqhw->this04; ebx++) { - hwwrite(vortex->mmio, 0x2b028 + ebx * 0x30, a[ebx]); - } -} - -static void vortex_EqHw_SetRightGainsCurrent(vortex_t * vortex, u16 a[]) -{ - eqhw_t *eqhw = &(vortex->eq.this04); - int ebx; - - for (ebx = 0; ebx < eqhw->this04; ebx++) { - hwwrite(vortex->mmio, 0x2b208 + ebx * 0x30, a[ebx]); - } -} - -#if 0 -static void vortex_EqHw_GetLeftGainsTarget(vortex_t * vortex, u16 a[]) -{ - eqhw_t *eqhw = &(vortex->eq.this04); - int ebx = 0; - - if (eqhw->this04 < 0) - return; - - do { - a[ebx] = hwread(vortex->mmio, 0x2b02c + ebx * 0x30); - ebx++; - } - while (ebx < eqhw->this04); -} - -static void vortex_EqHw_GetRightGainsTarget(vortex_t * vortex, u16 a[]) -{ - eqhw_t *eqhw = &(vortex->eq.this04); - int ebx = 0; - - if (eqhw->this04 < 0) - return; - - do { - a[ebx] = hwread(vortex->mmio, 0x2b20c + ebx * 0x30); - ebx++; - } - while (ebx < eqhw->this04); -} - -static void vortex_EqHw_GetLeftGainsCurrent(vortex_t * vortex, u16 a[]) -{ - eqhw_t *eqhw = &(vortex->eq.this04); - int ebx = 0; - - if (eqhw->this04 < 0) - return; - - do { - a[ebx] = hwread(vortex->mmio, 0x2b028 + ebx * 0x30); - ebx++; - } - while (ebx < eqhw->this04); -} - -static void vortex_EqHw_GetRightGainsCurrent(vortex_t * vortex, u16 a[]) -{ - eqhw_t *eqhw = &(vortex->eq.this04); - int ebx = 0; - - if (eqhw->this04 < 0) - return; - - do { - a[ebx] = hwread(vortex->mmio, 0x2b208 + ebx * 0x30); - ebx++; - } - while (ebx < eqhw->this04); -} - -#endif -/* EQ band levels settings */ -static void vortex_EqHw_SetLevels(vortex_t * vortex, u16 peaks[]) -{ - eqhw_t *eqhw = &(vortex->eq.this04); - int i; - - /* set left peaks */ - for (i = 0; i < eqhw->this04; i++) { - hwwrite(vortex->mmio, 0x2b024 + i * VORTEX_BAND_COEFF_SIZE, peaks[i]); - } - - hwwrite(vortex->mmio, 0x2b3cc, peaks[eqhw->this04]); - hwwrite(vortex->mmio, 0x2b3d8, peaks[eqhw->this04 + 1]); - - /* set right peaks */ - for (i = 0; i < eqhw->this04; i++) { - hwwrite(vortex->mmio, 0x2b204 + i * VORTEX_BAND_COEFF_SIZE, - peaks[i + (eqhw->this04 + 2)]); - } - - hwwrite(vortex->mmio, 0x2b3e4, peaks[2 + (eqhw->this04 * 2)]); - hwwrite(vortex->mmio, 0x2b3f0, peaks[3 + (eqhw->this04 * 2)]); -} - -#if 0 -static void vortex_EqHw_GetLevels(vortex_t * vortex, u16 a[]) -{ - eqhw_t *eqhw = &(vortex->eq.this04); - int ebx; - - if (eqhw->this04 < 0) - return; - - ebx = 0; - do { - a[ebx] = hwread(vortex->mmio, 0x2b024 + ebx * 0x30); - ebx++; - } - while (ebx < eqhw->this04); - - a[eqhw->this04] = hwread(vortex->mmio, 0x2b3cc); - a[eqhw->this04 + 1] = hwread(vortex->mmio, 0x2b3d8); - - ebx = 0; - do { - a[ebx + (eqhw->this04 + 2)] = - hwread(vortex->mmio, 0x2b204 + ebx * 0x30); - ebx++; - } - while (ebx < eqhw->this04); - - a[2 + (eqhw->this04 * 2)] = hwread(vortex->mmio, 0x2b3e4); - a[3 + (eqhw->this04 * 2)] = hwread(vortex->mmio, 0x2b3f0); -} - -#endif -/* Global Control */ -static void vortex_EqHw_SetControlReg(vortex_t * vortex, u32 reg) -{ - hwwrite(vortex->mmio, 0x2b440, reg); -} - -static void vortex_EqHw_SetSampleRate(vortex_t * vortex, u32 sr) -{ - hwwrite(vortex->mmio, 0x2b440, ((sr & 0x1f) << 3) | 0xb800); -} - -#if 0 -static void vortex_EqHw_GetControlReg(vortex_t * vortex, u32 *reg) -{ - *reg = hwread(vortex->mmio, 0x2b440); -} - -static void vortex_EqHw_GetSampleRate(vortex_t * vortex, u32 *sr) -{ - *sr = (hwread(vortex->mmio, 0x2b440) >> 3) & 0x1f; -} - -#endif -static void vortex_EqHw_Enable(vortex_t * vortex) -{ - hwwrite(vortex->mmio, VORTEX_EQ_CTRL, 0xf001); -} - -static void vortex_EqHw_Disable(vortex_t * vortex) -{ - hwwrite(vortex->mmio, VORTEX_EQ_CTRL, 0xf000); -} - -/* Reset (zero) buffers */ -static void vortex_EqHw_ZeroIO(vortex_t * vortex) -{ - int i; - for (i = 0; i < 0x8; i++) - hwwrite(vortex->mmio, VORTEX_EQ_DEST + (i << 2), 0x0); - for (i = 0; i < 0x4; i++) - hwwrite(vortex->mmio, VORTEX_EQ_SOURCE + (i << 2), 0x0); -} - -static void vortex_EqHw_ZeroA3DIO(vortex_t * vortex) -{ - int i; - for (i = 0; i < 0x4; i++) - hwwrite(vortex->mmio, VORTEX_EQ_DEST + (i << 2), 0x0); -} - -static void vortex_EqHw_ZeroState(vortex_t * vortex) -{ - - vortex_EqHw_SetControlReg(vortex, 0); - vortex_EqHw_ZeroIO(vortex); - hwwrite(vortex->mmio, 0x2b3c0, 0); - - vortex_EqHw_SetTimeConsts(vortex, 0, 0); - - vortex_EqHw_SetLeftCoefs(vortex, asEqCoefsZeros); - vortex_EqHw_SetRightCoefs(vortex, asEqCoefsZeros); - - vortex_EqHw_SetLeftGainsCurrent(vortex, eq_gains_zero); - vortex_EqHw_SetRightGainsCurrent(vortex, eq_gains_zero); - vortex_EqHw_SetLeftGainsTarget(vortex, eq_gains_zero); - vortex_EqHw_SetRightGainsTarget(vortex, eq_gains_zero); - - vortex_EqHw_SetBypassGain(vortex, 0, 0); - //vortex_EqHw_SetCurrBypassGain(vortex, 0, 0); - vortex_EqHw_SetA3DBypassGain(vortex, 0, 0); - //vortex_EqHw_SetCurrA3DBypassGain(vortex, 0, 0); - vortex_EqHw_SetLeftStates(vortex, eq_states_zero, asEqOutStateZeros); - vortex_EqHw_SetRightStates(vortex, eq_states_zero, asEqOutStateZeros); - vortex_EqHw_SetLevels(vortex, (u16 *) eq_levels); -} - -/* Program coeficients as pass through */ -static void vortex_EqHw_ProgramPipe(vortex_t * vortex) -{ - vortex_EqHw_SetTimeConsts(vortex, 0, 0); - - vortex_EqHw_SetLeftCoefs(vortex, asEqCoefsPipes); - vortex_EqHw_SetRightCoefs(vortex, asEqCoefsPipes); - - vortex_EqHw_SetLeftGainsCurrent(vortex, eq_gains_current); - vortex_EqHw_SetRightGainsCurrent(vortex, eq_gains_current); - vortex_EqHw_SetLeftGainsTarget(vortex, eq_gains_current); - vortex_EqHw_SetRightGainsTarget(vortex, eq_gains_current); -} - -/* Program EQ block as 10 band Equalizer */ -static void -vortex_EqHw_Program10Band(vortex_t * vortex, auxxEqCoeffSet_t * coefset) -{ - - vortex_EqHw_SetTimeConsts(vortex, 0xc, 0x7fe0); - - vortex_EqHw_SetLeftCoefs(vortex, coefset->LeftCoefs); - vortex_EqHw_SetRightCoefs(vortex, coefset->RightCoefs); - - vortex_EqHw_SetLeftGainsCurrent(vortex, coefset->LeftGains); - - vortex_EqHw_SetRightGainsTarget(vortex, coefset->RightGains); - vortex_EqHw_SetLeftGainsTarget(vortex, coefset->LeftGains); - - vortex_EqHw_SetRightGainsCurrent(vortex, coefset->RightGains); -} - -/* Read all EQ peaks. (think VU meter) */ -static void vortex_EqHw_GetTenBandLevels(vortex_t * vortex, u16 peaks[]) -{ - eqhw_t *eqhw = &(vortex->eq.this04); - int i; - - if (eqhw->this04 <= 0) - return; - - for (i = 0; i < eqhw->this04; i++) - peaks[i] = hwread(vortex->mmio, 0x2B024 + i * 0x30); - for (i = 0; i < eqhw->this04; i++) - peaks[i + eqhw->this04] = - hwread(vortex->mmio, 0x2B204 + i * 0x30); -} - -/* CEqlzr.s */ - -static int vortex_Eqlzr_GetLeftGain(vortex_t * vortex, u16 index, u16 * gain) -{ - eqlzr_t *eq = &(vortex->eq); - - if (eq->this28) { - *gain = eq->this130[index]; - return 0; - } - return 1; -} - -static void vortex_Eqlzr_SetLeftGain(vortex_t * vortex, u16 index, u16 gain) -{ - eqlzr_t *eq = &(vortex->eq); - - if (eq->this28 == 0) - return; - - eq->this130[index] = gain; - if (eq->this54) - return; - - vortex_EqHw_SetLeftGainsSingleTarget(vortex, index, gain); -} - -static int vortex_Eqlzr_GetRightGain(vortex_t * vortex, u16 index, u16 * gain) -{ - eqlzr_t *eq = &(vortex->eq); - - if (eq->this28) { - *gain = eq->this130[index + eq->this10]; - return 0; - } - return 1; -} - -static void vortex_Eqlzr_SetRightGain(vortex_t * vortex, u16 index, u16 gain) -{ - eqlzr_t *eq = &(vortex->eq); - - if (eq->this28 == 0) - return; - - eq->this130[index + eq->this10] = gain; - if (eq->this54) - return; - - vortex_EqHw_SetRightGainsSingleTarget(vortex, index, gain); -} - -#if 0 -static int -vortex_Eqlzr_GetAllBands(vortex_t * vortex, u16 * gains, s32 *cnt) -{ - eqlzr_t *eq = &(vortex->eq); - int si = 0; - - if (eq->this10 == 0) - return 1; - - { - if (vortex_Eqlzr_GetLeftGain(vortex, si, &gains[si])) - return 1; - if (vortex_Eqlzr_GetRightGain - (vortex, si, &gains[si + eq->this10])) - return 1; - si++; - } - while (eq->this10 > si) ; - *cnt = si * 2; - return 0; -} -#endif -static int vortex_Eqlzr_SetAllBandsFromActiveCoeffSet(vortex_t * vortex) -{ - eqlzr_t *eq = &(vortex->eq); - - vortex_EqHw_SetLeftGainsTarget(vortex, eq->this130); - vortex_EqHw_SetRightGainsTarget(vortex, &(eq->this130[eq->this10])); - - return 0; -} - -static int -vortex_Eqlzr_SetAllBands(vortex_t * vortex, u16 gains[], s32 count) -{ - eqlzr_t *eq = &(vortex->eq); - int i; - - if (((eq->this10) * 2 != count) || (eq->this28 == 0)) - return 1; - - for (i = 0; i < count; i++) { - eq->this130[i] = gains[i]; - } - - if (eq->this54) - return 0; - return vortex_Eqlzr_SetAllBandsFromActiveCoeffSet(vortex); -} - -static void -vortex_Eqlzr_SetA3dBypassGain(vortex_t * vortex, u32 a, u32 b) -{ - eqlzr_t *eq = &(vortex->eq); - u32 eax, ebx; - - eq->this58 = a; - eq->this5c = b; - if (eq->this54) - eax = eq->this0e; - else - eax = eq->this0a; - ebx = (eax * eq->this58) >> 0x10; - eax = (eax * eq->this5c) >> 0x10; - vortex_EqHw_SetA3DBypassGain(vortex, ebx, eax); -} - -static void vortex_Eqlzr_ProgramA3dBypassGain(vortex_t * vortex) -{ - eqlzr_t *eq = &(vortex->eq); - u32 eax, ebx; - - if (eq->this54) - eax = eq->this0e; - else - eax = eq->this0a; - ebx = (eax * eq->this58) >> 0x10; - eax = (eax * eq->this5c) >> 0x10; - vortex_EqHw_SetA3DBypassGain(vortex, ebx, eax); -} - -static void vortex_Eqlzr_ShutDownA3d(vortex_t * vortex) -{ - if (vortex != NULL) - vortex_EqHw_ZeroA3DIO(vortex); -} - -static void vortex_Eqlzr_SetBypass(vortex_t * vortex, u32 bp) -{ - eqlzr_t *eq = &(vortex->eq); - - if ((eq->this28) && (bp == 0)) { - /* EQ enabled */ - vortex_Eqlzr_SetAllBandsFromActiveCoeffSet(vortex); - vortex_EqHw_SetBypassGain(vortex, eq->this08, eq->this08); - } else { - /* EQ disabled. */ - vortex_EqHw_SetLeftGainsTarget(vortex, eq->this14_array); - vortex_EqHw_SetRightGainsTarget(vortex, eq->this14_array); - vortex_EqHw_SetBypassGain(vortex, eq->this0c, eq->this0c); - } - vortex_Eqlzr_ProgramA3dBypassGain(vortex); -} - -static void vortex_Eqlzr_ReadAndSetActiveCoefSet(vortex_t * vortex) -{ - eqlzr_t *eq = &(vortex->eq); - - /* Set EQ BiQuad filter coeficients */ - memcpy(&(eq->coefset), &asEqCoefsNormal, sizeof(auxxEqCoeffSet_t)); - /* Set EQ Band gain levels and dump into hardware registers. */ - vortex_Eqlzr_SetAllBands(vortex, eq_gains_normal, eq->this10 * 2); -} - -static int vortex_Eqlzr_GetAllPeaks(vortex_t * vortex, u16 * peaks, int *count) -{ - eqlzr_t *eq = &(vortex->eq); - - if (eq->this10 == 0) - return 1; - *count = eq->this10 * 2; - vortex_EqHw_GetTenBandLevels(vortex, peaks); - return 0; -} - -#if 0 -static auxxEqCoeffSet_t *vortex_Eqlzr_GetActiveCoefSet(vortex_t * vortex) -{ - eqlzr_t *eq = &(vortex->eq); - - return (&(eq->coefset)); -} -#endif -static void vortex_Eqlzr_init(vortex_t * vortex) -{ - eqlzr_t *eq = &(vortex->eq); - - /* Object constructor */ - //eq->this04 = 0; - eq->this08 = 0; /* Bypass gain with EQ in use. */ - eq->this0a = 0x5999; - eq->this0c = 0x5999; /* Bypass gain with EQ disabled. */ - eq->this0e = 0x5999; - - eq->this10 = 0xa; /* 10 eq frequency bands. */ - eq->this04.this04 = eq->this10; - eq->this28 = 0x1; /* if 1 => Allow read access to this130 (gains) */ - eq->this54 = 0x0; /* if 1 => Dont Allow access to hardware (gains) */ - eq->this58 = 0xffff; - eq->this5c = 0xffff; - - /* Set gains. */ - memset(eq->this14_array, 0, sizeof(eq->this14_array)); - - /* Actual init. */ - vortex_EqHw_ZeroState(vortex); - vortex_EqHw_SetSampleRate(vortex, 0x11); - vortex_Eqlzr_ReadAndSetActiveCoefSet(vortex); - - vortex_EqHw_Program10Band(vortex, &(eq->coefset)); - vortex_Eqlzr_SetBypass(vortex, eq->this54); - vortex_Eqlzr_SetA3dBypassGain(vortex, 0, 0); - vortex_EqHw_Enable(vortex); -} - -static void vortex_Eqlzr_shutdown(vortex_t * vortex) -{ - vortex_Eqlzr_ShutDownA3d(vortex); - vortex_EqHw_ProgramPipe(vortex); - vortex_EqHw_Disable(vortex); -} - -/* ALSA interface */ - -/* Control interface */ -#define snd_vortex_eqtoggle_info snd_ctl_boolean_mono_info - -static int -snd_vortex_eqtoggle_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - vortex_t *vortex = snd_kcontrol_chip(kcontrol); - eqlzr_t *eq = &(vortex->eq); - //int i = kcontrol->private_value; - - ucontrol->value.integer.value[0] = eq->this54 ? 0 : 1; - - return 0; -} - -static int -snd_vortex_eqtoggle_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - vortex_t *vortex = snd_kcontrol_chip(kcontrol); - eqlzr_t *eq = &(vortex->eq); - //int i = kcontrol->private_value; - - eq->this54 = ucontrol->value.integer.value[0] ? 0 : 1; - vortex_Eqlzr_SetBypass(vortex, eq->this54); - - return 1; /* Allways changes */ -} - -static struct snd_kcontrol_new vortex_eqtoggle_kcontrol __devinitdata = { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "EQ Enable", - .index = 0, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .private_value = 0, - .info = snd_vortex_eqtoggle_info, - .get = snd_vortex_eqtoggle_get, - .put = snd_vortex_eqtoggle_put -}; - -static int -snd_vortex_eq_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = 2; - uinfo->value.integer.min = 0x0000; - uinfo->value.integer.max = 0x7fff; - return 0; -} - -static int -snd_vortex_eq_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) -{ - vortex_t *vortex = snd_kcontrol_chip(kcontrol); - int i = kcontrol->private_value; - u16 gainL = 0, gainR = 0; - - vortex_Eqlzr_GetLeftGain(vortex, i, &gainL); - vortex_Eqlzr_GetRightGain(vortex, i, &gainR); - ucontrol->value.integer.value[0] = gainL; - ucontrol->value.integer.value[1] = gainR; - return 0; -} - -static int -snd_vortex_eq_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) -{ - vortex_t *vortex = snd_kcontrol_chip(kcontrol); - int changed = 0, i = kcontrol->private_value; - u16 gainL = 0, gainR = 0; - - vortex_Eqlzr_GetLeftGain(vortex, i, &gainL); - vortex_Eqlzr_GetRightGain(vortex, i, &gainR); - - if (gainL != ucontrol->value.integer.value[0]) { - vortex_Eqlzr_SetLeftGain(vortex, i, - ucontrol->value.integer.value[0]); - changed = 1; - } - if (gainR != ucontrol->value.integer.value[1]) { - vortex_Eqlzr_SetRightGain(vortex, i, - ucontrol->value.integer.value[1]); - changed = 1; - } - return changed; -} - -static struct snd_kcontrol_new vortex_eq_kcontrol __devinitdata = { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = " .", - .index = 0, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .private_value = 0, - .info = snd_vortex_eq_info, - .get = snd_vortex_eq_get, - .put = snd_vortex_eq_put -}; - -static int -snd_vortex_peaks_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = 20; - uinfo->value.integer.min = 0x0000; - uinfo->value.integer.max = 0x7fff; - return 0; -} - -static int -snd_vortex_peaks_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) -{ - vortex_t *vortex = snd_kcontrol_chip(kcontrol); - int i, count = 0; - u16 peaks[20]; - - vortex_Eqlzr_GetAllPeaks(vortex, peaks, &count); - if (count != 20) { - printk(KERN_ERR "vortex: peak count error 20 != %d \n", count); - return -1; - } - for (i = 0; i < 20; i++) - ucontrol->value.integer.value[i] = peaks[i]; - - return 0; -} - -static struct snd_kcontrol_new vortex_levels_kcontrol __devinitdata = { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "EQ Peaks", - .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, - .info = snd_vortex_peaks_info, - .get = snd_vortex_peaks_get, -}; - -/* EQ band gain labels. */ -static char *EqBandLabels[10] __devinitdata = { - "EQ0 31Hz\0", - "EQ1 63Hz\0", - "EQ2 125Hz\0", - "EQ3 250Hz\0", - "EQ4 500Hz\0", - "EQ5 1KHz\0", - "EQ6 2KHz\0", - "EQ7 4KHz\0", - "EQ8 8KHz\0", - "EQ9 16KHz\0", -}; - -/* ALSA driver entry points. Init and exit. */ -static int __devinit vortex_eq_init(vortex_t * vortex) -{ - struct snd_kcontrol *kcontrol; - int err, i; - - vortex_Eqlzr_init(vortex); - - if ((kcontrol = - snd_ctl_new1(&vortex_eqtoggle_kcontrol, vortex)) == NULL) - return -ENOMEM; - kcontrol->private_value = 0; - if ((err = snd_ctl_add(vortex->card, kcontrol)) < 0) - return err; - - /* EQ gain controls */ - for (i = 0; i < 10; i++) { - if ((kcontrol = - snd_ctl_new1(&vortex_eq_kcontrol, vortex)) == NULL) - return -ENOMEM; - snprintf(kcontrol->id.name, sizeof(kcontrol->id.name), - "%s Playback Volume", EqBandLabels[i]); - kcontrol->private_value = i; - if ((err = snd_ctl_add(vortex->card, kcontrol)) < 0) - return err; - //vortex->eqctrl[i] = kcontrol; - } - /* EQ band levels */ - if ((kcontrol = snd_ctl_new1(&vortex_levels_kcontrol, vortex)) == NULL) - return -ENOMEM; - if ((err = snd_ctl_add(vortex->card, kcontrol)) < 0) - return err; - - return 0; -} - -static int vortex_eq_free(vortex_t * vortex) -{ - /* - //FIXME: segfault because vortex->eqctrl[i] == 4 - int i; - for (i=0; i<10; i++) { - if (vortex->eqctrl[i]) - snd_ctl_remove(vortex->card, vortex->eqctrl[i]); - } - */ - vortex_Eqlzr_shutdown(vortex); - return 0; -} - -/* End */ diff --git a/ANDROID_3.4.5/sound/pci/au88x0/au88x0_eq.h b/ANDROID_3.4.5/sound/pci/au88x0/au88x0_eq.h deleted file mode 100644 index 474cd004..00000000 --- a/ANDROID_3.4.5/sound/pci/au88x0/au88x0_eq.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef AU88X0_EQ_H -#define AU88X0_EQ_H - -/*************************************************************************** - * au88x0_eq.h - * - * Definitions and constant data for the Aureal Hardware EQ. - * - * Sun Jun 8 18:23:38 2003 - * Author: Manuel Jander (mjander@users.sourceforge.net) - ****************************************************************************/ - -typedef struct { - u16 LeftCoefs[50]; //0x4 - u16 RightCoefs[50]; // 0x68 - u16 LeftGains[10]; //0xd0 - u16 RightGains[10]; //0xe4 -} auxxEqCoeffSet_t; - -typedef struct { - s32 this04; /* How many filters for each side (default = 10) */ - s32 this08; /* inited to cero. Stereo flag? */ -} eqhw_t; - -typedef struct { - eqhw_t this04; /* CHwEq */ - u16 this08; /* Bad codec flag ? SetBypassGain: bypass gain */ - u16 this0a; - u16 this0c; /* SetBypassGain: bypass gain when this28 is not set. */ - u16 this0e; - - s32 this10; /* How many gains are used for each side (right or left). */ - u16 this14_array[10]; /* SetLeftGainsTarget: Left (and right?) EQ gains */ - s32 this28; /* flag related to EQ enabled or not. Gang flag ? */ - s32 this54; /* SetBypass */ - s32 this58; - s32 this5c; - /*0x60 */ auxxEqCoeffSet_t coefset; - /* 50 u16 word each channel. */ - u16 this130[20]; /* Left and Right gains */ -} eqlzr_t; - -#endif diff --git a/ANDROID_3.4.5/sound/pci/au88x0/au88x0_eqdata.c b/ANDROID_3.4.5/sound/pci/au88x0/au88x0_eqdata.c deleted file mode 100644 index ce8dca8c..00000000 --- a/ANDROID_3.4.5/sound/pci/au88x0/au88x0_eqdata.c +++ /dev/null @@ -1,116 +0,0 @@ -/* Data structs */ - -static u16 asEqCoefsZeros[50] = { - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -}; - -static u16 asEqCoefsPipes[64] = { - 0x0000, 0x0000, - 0x0000, 0x0666, 0x0000, 0x0000, 0x0666, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0666, 0x0000, 0x0000, 0x0666, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0666, 0x0000, 0x0000, 0x0666, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0666, 0x0000, 0x0000, 0x0666, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0666, 0x0000, 0x0000, 0x066a, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000 -}; - -/* More coef sets can be found in the win2k "inf" file. */ -static auxxEqCoeffSet_t asEqCoefsNormal = { - .LeftCoefs = { - 0x7e60, 0xc19e, 0x0001, 0x0002, 0x0001, - 0x7fa0, 0xc05f, 0x004f, 0x0000, 0xffb1, - 0x7f3f, 0xc0bc, 0x00c2, 0x0000, 0xff3e, - 0x7e78, 0xc177, 0x011f, 0x0000, 0xfee1, - 0x7cd6, 0xc2e5, 0x025c, 0x0000, 0xfda4, - 0x7949, 0xc5aa, 0x0467, 0x0000, 0xfb99, - 0x7120, 0xcadf, 0x0864, 0x0000, 0xf79c, - 0x5d33, 0xd430, 0x0f7e, 0x0000, 0xf082, - 0x2beb, 0xe3ca, 0x1bd3, 0x0000, 0xe42d, - 0xd740, 0xf01d, 0x2ac5, 0x0000, 0xd53b}, - - .RightCoefs = { - 0x7e60, 0xc19e, 0x0001, 0x0002, 0x0001, - 0x7fa0, 0xc05f, 0x004f, 0x0000, 0xffb1, - 0x7f3f, 0xc0bc, 0x00c2, 0x0000, 0xff3e, - 0x7e78, 0xc177, 0x011f, 0x0000, 0xfee1, - 0x7cd6, 0xc2e5, 0x025c, 0x0000, 0xfda4, - 0x7949, 0xc5aa, 0x0467, 0x0000, 0xfb99, - 0x7120, 0xcadf, 0x0864, 0x0000, 0xf79c, - 0x5d33, 0xd430, 0x0f7e, 0x0000, 0xf082, - 0x2beb, 0xe3ca, 0x1bd3, 0x0000, 0xe42d, - 0xd740, 0xf01d, 0x2ac5, 0x0000, 0xd53b}, - - .LeftGains = { - 0x3e96, 0x3e96, 0x3e96, 0x3e96, 0x3e96, - 0x3e96, 0x3e96, 0x3e96, 0x3e96, 0x3e96}, - .RightGains = { - 0x3e96, 0x3e96, 0x3e96, 0x3e96, 0x3e96, - 0x3e96, 0x3e96, 0x3e96, 0x3e96, 0x3e96} -}; - -static u16 eq_gains_normal[20] = { - 0x3e96, 0x3e96, 0x3e96, 0x3e96, 0x3e96, - 0x3e96, 0x3e96, 0x3e96, 0x3e96, 0x3e96, - 0x3e96, 0x3e96, 0x3e96, 0x3e96, 0x3e96, - 0x3e96, 0x3e96, 0x3e96, 0x3e96, 0x3e96 -}; - -/* _rodatab60 */ -static u16 eq_gains_zero[10] = { - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 -}; - -/* _rodatab7c: ProgramPipe */ -static u16 eq_gains_current[12] = { - 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, - 0x7fff, - 0x7fff, 0x7fff, 0x7fff -}; - -/* _rodatab78 */ -static u16 eq_states_zero[2] = { 0x0000, 0x0000 }; - -static u16 asEqOutStateZeros[48] = { - 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000 -}; - -/*_rodataba0:*/ -static u16 eq_levels[64] = { - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 -}; diff --git a/ANDROID_3.4.5/sound/pci/au88x0/au88x0_game.c b/ANDROID_3.4.5/sound/pci/au88x0/au88x0_game.c deleted file mode 100644 index c07c792b..00000000 --- a/ANDROID_3.4.5/sound/pci/au88x0/au88x0_game.c +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Manuel Jander. - * - * Based on the work of: - * Vojtech Pavlik - * Raymond Ingles - * - * 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 - * - * Should you need to contact me, the author, you can do so either by - * e-mail - mail your message to <vojtech@suse.cz>, or by paper mail: - * Vojtech Pavlik, Ucitelska 1576, Prague 8, 182 00 Czech Republic - * - * Based 90% on Vojtech Pavlik pcigame driver. - * Merged and modified by Manuel Jander, for the OpenVortex - * driver. (email: mjander@embedded.cl). - */ - -#include <linux/time.h> -#include <linux/delay.h> -#include <linux/init.h> -#include <sound/core.h> -#include "au88x0.h" -#include <linux/gameport.h> -#include <linux/export.h> - -#if defined(CONFIG_GAMEPORT) || (defined(MODULE) && defined(CONFIG_GAMEPORT_MODULE)) - -#define VORTEX_GAME_DWAIT 20 /* 20 ms */ - -static unsigned char vortex_game_read(struct gameport *gameport) -{ - vortex_t *vortex = gameport_get_port_data(gameport); - return hwread(vortex->mmio, VORTEX_GAME_LEGACY); -} - -static void vortex_game_trigger(struct gameport *gameport) -{ - vortex_t *vortex = gameport_get_port_data(gameport); - hwwrite(vortex->mmio, VORTEX_GAME_LEGACY, 0xff); -} - -static int -vortex_game_cooked_read(struct gameport *gameport, int *axes, int *buttons) -{ - vortex_t *vortex = gameport_get_port_data(gameport); - int i; - - *buttons = (~hwread(vortex->mmio, VORTEX_GAME_LEGACY) >> 4) & 0xf; - - for (i = 0; i < 4; i++) { - axes[i] = - hwread(vortex->mmio, VORTEX_GAME_AXIS + (i * AXIS_SIZE)); - if (axes[i] == AXIS_RANGE) - axes[i] = -1; - } - return 0; -} - -static int vortex_game_open(struct gameport *gameport, int mode) -{ - vortex_t *vortex = gameport_get_port_data(gameport); - - switch (mode) { - case GAMEPORT_MODE_COOKED: - hwwrite(vortex->mmio, VORTEX_CTRL2, - hwread(vortex->mmio, - VORTEX_CTRL2) | CTRL2_GAME_ADCMODE); - msleep(VORTEX_GAME_DWAIT); - return 0; - case GAMEPORT_MODE_RAW: - hwwrite(vortex->mmio, VORTEX_CTRL2, - hwread(vortex->mmio, - VORTEX_CTRL2) & ~CTRL2_GAME_ADCMODE); - return 0; - default: - return -1; - } - - return 0; -} - -static int __devinit vortex_gameport_register(vortex_t * vortex) -{ - struct gameport *gp; - - vortex->gameport = gp = gameport_allocate_port(); - if (!gp) { - printk(KERN_ERR "vortex: cannot allocate memory for gameport\n"); - return -ENOMEM; - }; - - gameport_set_name(gp, "AU88x0 Gameport"); - gameport_set_phys(gp, "pci%s/gameport0", pci_name(vortex->pci_dev)); - gameport_set_dev_parent(gp, &vortex->pci_dev->dev); - - gp->read = vortex_game_read; - gp->trigger = vortex_game_trigger; - gp->cooked_read = vortex_game_cooked_read; - gp->open = vortex_game_open; - - gameport_set_port_data(gp, vortex); - gp->fuzz = 64; - - gameport_register_port(gp); - - return 0; -} - -static void vortex_gameport_unregister(vortex_t * vortex) -{ - if (vortex->gameport) { - gameport_unregister_port(vortex->gameport); - vortex->gameport = NULL; - } -} - -#else -static inline int vortex_gameport_register(vortex_t * vortex) { return -ENOSYS; } -static inline void vortex_gameport_unregister(vortex_t * vortex) { } -#endif diff --git a/ANDROID_3.4.5/sound/pci/au88x0/au88x0_mixer.c b/ANDROID_3.4.5/sound/pci/au88x0/au88x0_mixer.c deleted file mode 100644 index 557c782a..00000000 --- a/ANDROID_3.4.5/sound/pci/au88x0/au88x0_mixer.c +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Vortex Mixer support. - * - * There is much more than just the AC97 mixer... - * - */ - -#include <linux/time.h> -#include <linux/init.h> -#include <sound/core.h> -#include "au88x0.h" - -static int __devinit snd_vortex_mixer(vortex_t * vortex) -{ - struct snd_ac97_bus *pbus; - struct snd_ac97_template ac97; - int err; - static struct snd_ac97_bus_ops ops = { - .write = vortex_codec_write, - .read = vortex_codec_read, - }; - - if ((err = snd_ac97_bus(vortex->card, 0, &ops, NULL, &pbus)) < 0) - return err; - memset(&ac97, 0, sizeof(ac97)); - // Initialize AC97 codec stuff. - ac97.private_data = vortex; - ac97.scaps = AC97_SCAP_NO_SPDIF; - err = snd_ac97_mixer(pbus, &ac97, &vortex->codec); - vortex->isquad = ((vortex->codec == NULL) ? 0 : (vortex->codec->ext_id&0x80)); - return err; -} diff --git a/ANDROID_3.4.5/sound/pci/au88x0/au88x0_mpu401.c b/ANDROID_3.4.5/sound/pci/au88x0/au88x0_mpu401.c deleted file mode 100644 index e6c6a0fe..00000000 --- a/ANDROID_3.4.5/sound/pci/au88x0/au88x0_mpu401.c +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (c) by Jaroslav Kysela <perex@perex.cz> - * Routines for control of MPU-401 in UART mode - * - * Modified for the Aureal Vortex based Soundcards - * by Manuel Jander (mjande@embedded.cl). - * - * 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 - * - */ - -#include <linux/time.h> -#include <linux/init.h> -#include <sound/core.h> -#include <sound/mpu401.h> -#include "au88x0.h" - -/* Check for mpu401 mmio support. */ -/* MPU401 legacy support is only provided as a emergency fallback * - * for older versions of ALSA. Its usage is strongly discouraged. */ -#ifndef MPU401_HW_AUREAL -#define VORTEX_MPU401_LEGACY -#endif - -/* Vortex MPU401 defines. */ -#define MIDI_CLOCK_DIV 0x61 -/* Standart MPU401 defines. */ -#define MPU401_RESET 0xff -#define MPU401_ENTER_UART 0x3f -#define MPU401_ACK 0xfe - -static int __devinit snd_vortex_midi(vortex_t * vortex) -{ - struct snd_rawmidi *rmidi; - int temp, mode; - struct snd_mpu401 *mpu; - unsigned long port; - -#ifdef VORTEX_MPU401_LEGACY - /* EnableHardCodedMPU401Port() */ - /* Enable Legacy MIDI Interface port. */ - port = (0x03 << 5); /* FIXME: static address. 0x330 */ - temp = - (hwread(vortex->mmio, VORTEX_CTRL) & ~CTRL_MIDI_PORT) | - CTRL_MIDI_EN | port; - hwwrite(vortex->mmio, VORTEX_CTRL, temp); -#else - /* Disable Legacy MIDI Interface port. */ - temp = - (hwread(vortex->mmio, VORTEX_CTRL) & ~CTRL_MIDI_PORT) & - ~CTRL_MIDI_EN; - hwwrite(vortex->mmio, VORTEX_CTRL, temp); -#endif - /* Mpu401UartInit() */ - mode = 1; - temp = hwread(vortex->mmio, VORTEX_CTRL2) & 0xffff00cf; - temp |= (MIDI_CLOCK_DIV << 8) | ((mode >> 24) & 0xff) << 4; - hwwrite(vortex->mmio, VORTEX_CTRL2, temp); - hwwrite(vortex->mmio, VORTEX_MIDI_CMD, MPU401_RESET); - - /* Check if anything is OK. */ - temp = hwread(vortex->mmio, VORTEX_MIDI_DATA); - if (temp != MPU401_ACK /*0xfe */ ) { - printk(KERN_ERR "midi port doesn't acknowledge!\n"); - return -ENODEV; - } - /* Enable MPU401 interrupts. */ - hwwrite(vortex->mmio, VORTEX_IRQ_CTRL, - hwread(vortex->mmio, VORTEX_IRQ_CTRL) | IRQ_MIDI); - - /* Create MPU401 instance. */ -#ifdef VORTEX_MPU401_LEGACY - if ((temp = - snd_mpu401_uart_new(vortex->card, 0, MPU401_HW_MPU401, 0x330, - MPU401_INFO_IRQ_HOOK, -1, &rmidi)) != 0) { - hwwrite(vortex->mmio, VORTEX_CTRL, - (hwread(vortex->mmio, VORTEX_CTRL) & - ~CTRL_MIDI_PORT) & ~CTRL_MIDI_EN); - return temp; - } -#else - port = (unsigned long)(vortex->mmio + VORTEX_MIDI_DATA); - if ((temp = - snd_mpu401_uart_new(vortex->card, 0, MPU401_HW_AUREAL, port, - MPU401_INFO_INTEGRATED | MPU401_INFO_MMIO | - MPU401_INFO_IRQ_HOOK, -1, &rmidi)) != 0) { - hwwrite(vortex->mmio, VORTEX_CTRL, - (hwread(vortex->mmio, VORTEX_CTRL) & - ~CTRL_MIDI_PORT) & ~CTRL_MIDI_EN); - return temp; - } - mpu = rmidi->private_data; - mpu->cport = (unsigned long)(vortex->mmio + VORTEX_MIDI_CMD); -#endif - /* Overwrite MIDI name */ - snprintf(rmidi->name, sizeof(rmidi->name), "%s MIDI %d", CARD_NAME_SHORT , vortex->card->number); - - vortex->rmidi = rmidi; - return 0; -} diff --git a/ANDROID_3.4.5/sound/pci/au88x0/au88x0_pcm.c b/ANDROID_3.4.5/sound/pci/au88x0/au88x0_pcm.c deleted file mode 100644 index e59f1207..00000000 --- a/ANDROID_3.4.5/sound/pci/au88x0/au88x0_pcm.c +++ /dev/null @@ -1,678 +0,0 @@ -/* - * 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 Library 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. - */ - -/* - * Vortex PCM ALSA driver. - * - * Supports ADB and WT DMA. Unfortunately, WT channels do not run yet. - * It remains stuck,and DMA transfers do not happen. - */ -#include <sound/asoundef.h> -#include <linux/time.h> -#include <sound/core.h> -#include <sound/pcm.h> -#include <sound/pcm_params.h> -#include "au88x0.h" - -#define VORTEX_PCM_TYPE(x) (x->name[40]) - -/* hardware definition */ -static struct snd_pcm_hardware snd_vortex_playback_hw_adb = { - .info = - (SNDRV_PCM_INFO_MMAP | /* SNDRV_PCM_INFO_RESUME | */ - SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_INTERLEAVED | - SNDRV_PCM_INFO_MMAP_VALID), - .formats = - SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_U8 | - SNDRV_PCM_FMTBIT_MU_LAW | SNDRV_PCM_FMTBIT_A_LAW, - .rates = SNDRV_PCM_RATE_CONTINUOUS, - .rate_min = 5000, - .rate_max = 48000, - .channels_min = 1, - .channels_max = 2, - .buffer_bytes_max = 0x10000, - .period_bytes_min = 0x20, - .period_bytes_max = 0x1000, - .periods_min = 2, - .periods_max = 1024, -}; - -#ifndef CHIP_AU8820 -static struct snd_pcm_hardware snd_vortex_playback_hw_a3d = { - .info = - (SNDRV_PCM_INFO_MMAP | /* SNDRV_PCM_INFO_RESUME | */ - SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_INTERLEAVED | - SNDRV_PCM_INFO_MMAP_VALID), - .formats = - SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_U8 | - SNDRV_PCM_FMTBIT_MU_LAW | SNDRV_PCM_FMTBIT_A_LAW, - .rates = SNDRV_PCM_RATE_CONTINUOUS, - .rate_min = 5000, - .rate_max = 48000, - .channels_min = 1, - .channels_max = 1, - .buffer_bytes_max = 0x10000, - .period_bytes_min = 0x100, - .period_bytes_max = 0x1000, - .periods_min = 2, - .periods_max = 64, -}; -#endif -static struct snd_pcm_hardware snd_vortex_playback_hw_spdif = { - .info = - (SNDRV_PCM_INFO_MMAP | /* SNDRV_PCM_INFO_RESUME | */ - SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_INTERLEAVED | - SNDRV_PCM_INFO_MMAP_VALID), - .formats = - SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_U8 | - SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE | SNDRV_PCM_FMTBIT_MU_LAW | - SNDRV_PCM_FMTBIT_A_LAW, - .rates = - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000, - .rate_min = 32000, - .rate_max = 48000, - .channels_min = 1, - .channels_max = 2, - .buffer_bytes_max = 0x10000, - .period_bytes_min = 0x100, - .period_bytes_max = 0x1000, - .periods_min = 2, - .periods_max = 64, -}; - -#ifndef CHIP_AU8810 -static struct snd_pcm_hardware snd_vortex_playback_hw_wt = { - .info = (SNDRV_PCM_INFO_MMAP | - SNDRV_PCM_INFO_INTERLEAVED | - SNDRV_PCM_INFO_BLOCK_TRANSFER | SNDRV_PCM_INFO_MMAP_VALID), - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rates = SNDRV_PCM_RATE_8000_48000 | SNDRV_PCM_RATE_CONTINUOUS, // SNDRV_PCM_RATE_48000, - .rate_min = 8000, - .rate_max = 48000, - .channels_min = 1, - .channels_max = 2, - .buffer_bytes_max = 0x10000, - .period_bytes_min = 0x0400, - .period_bytes_max = 0x1000, - .periods_min = 2, - .periods_max = 64, -}; -#endif -#ifdef CHIP_AU8830 -static unsigned int au8830_channels[3] = { - 1, 2, 4, -}; - -static struct snd_pcm_hw_constraint_list hw_constraints_au8830_channels = { - .count = ARRAY_SIZE(au8830_channels), - .list = au8830_channels, - .mask = 0, -}; -#endif - -static void vortex_notify_pcm_vol_change(struct snd_card *card, - struct snd_kcontrol *kctl, int activate) -{ - if (activate) - kctl->vd[0].access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE; - else - kctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE; - snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_VALUE | - SNDRV_CTL_EVENT_MASK_INFO, &(kctl->id)); -} - -/* open callback */ -static int snd_vortex_pcm_open(struct snd_pcm_substream *substream) -{ - vortex_t *vortex = snd_pcm_substream_chip(substream); - struct snd_pcm_runtime *runtime = substream->runtime; - int err; - - /* Force equal size periods */ - if ((err = - snd_pcm_hw_constraint_integer(runtime, - SNDRV_PCM_HW_PARAM_PERIODS)) < 0) - return err; - /* Avoid PAGE_SIZE boundary to fall inside of a period. */ - if ((err = - snd_pcm_hw_constraint_pow2(runtime, 0, - SNDRV_PCM_HW_PARAM_PERIOD_BYTES)) < 0) - return err; - - snd_pcm_hw_constraint_step(runtime, 0, - SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 64); - - if (VORTEX_PCM_TYPE(substream->pcm) != VORTEX_PCM_WT) { -#ifndef CHIP_AU8820 - if (VORTEX_PCM_TYPE(substream->pcm) == VORTEX_PCM_A3D) { - runtime->hw = snd_vortex_playback_hw_a3d; - } -#endif - if (VORTEX_PCM_TYPE(substream->pcm) == VORTEX_PCM_SPDIF) { - runtime->hw = snd_vortex_playback_hw_spdif; - switch (vortex->spdif_sr) { - case 32000: - runtime->hw.rates = SNDRV_PCM_RATE_32000; - break; - case 44100: - runtime->hw.rates = SNDRV_PCM_RATE_44100; - break; - case 48000: - runtime->hw.rates = SNDRV_PCM_RATE_48000; - break; - } - } - if (VORTEX_PCM_TYPE(substream->pcm) == VORTEX_PCM_ADB - || VORTEX_PCM_TYPE(substream->pcm) == VORTEX_PCM_I2S) - runtime->hw = snd_vortex_playback_hw_adb; -#ifdef CHIP_AU8830 - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK && - VORTEX_IS_QUAD(vortex) && - VORTEX_PCM_TYPE(substream->pcm) == VORTEX_PCM_ADB) { - runtime->hw.channels_max = 4; - snd_pcm_hw_constraint_list(runtime, 0, - SNDRV_PCM_HW_PARAM_CHANNELS, - &hw_constraints_au8830_channels); - } -#endif - substream->runtime->private_data = NULL; - } -#ifndef CHIP_AU8810 - else { - runtime->hw = snd_vortex_playback_hw_wt; - substream->runtime->private_data = NULL; - } -#endif - return 0; -} - -/* close callback */ -static int snd_vortex_pcm_close(struct snd_pcm_substream *substream) -{ - //vortex_t *chip = snd_pcm_substream_chip(substream); - stream_t *stream = (stream_t *) substream->runtime->private_data; - - // the hardware-specific codes will be here - if (stream != NULL) { - stream->substream = NULL; - stream->nr_ch = 0; - } - substream->runtime->private_data = NULL; - return 0; -} - -/* hw_params callback */ -static int -snd_vortex_pcm_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *hw_params) -{ - vortex_t *chip = snd_pcm_substream_chip(substream); - stream_t *stream = (stream_t *) (substream->runtime->private_data); - int err; - - // Alloc buffer memory. - err = - snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params)); - if (err < 0) { - printk(KERN_ERR "Vortex: pcm page alloc failed!\n"); - return err; - } - /* - printk(KERN_INFO "Vortex: periods %d, period_bytes %d, channels = %d\n", params_periods(hw_params), - params_period_bytes(hw_params), params_channels(hw_params)); - */ - spin_lock_irq(&chip->lock); - // Make audio routes and config buffer DMA. - if (VORTEX_PCM_TYPE(substream->pcm) != VORTEX_PCM_WT) { - int dma, type = VORTEX_PCM_TYPE(substream->pcm); - /* Dealloc any routes. */ - if (stream != NULL) - vortex_adb_allocroute(chip, stream->dma, - stream->nr_ch, stream->dir, - stream->type, - substream->number); - /* Alloc routes. */ - dma = - vortex_adb_allocroute(chip, -1, - params_channels(hw_params), - substream->stream, type, - substream->number); - if (dma < 0) { - spin_unlock_irq(&chip->lock); - return dma; - } - stream = substream->runtime->private_data = &chip->dma_adb[dma]; - stream->substream = substream; - /* Setup Buffers. */ - vortex_adbdma_setbuffers(chip, dma, - params_period_bytes(hw_params), - params_periods(hw_params)); - if (VORTEX_PCM_TYPE(substream->pcm) == VORTEX_PCM_ADB) { - chip->pcm_vol[substream->number].active = 1; - vortex_notify_pcm_vol_change(chip->card, - chip->pcm_vol[substream->number].kctl, 1); - } - } -#ifndef CHIP_AU8810 - else { - /* if (stream != NULL) - vortex_wt_allocroute(chip, substream->number, 0); */ - vortex_wt_allocroute(chip, substream->number, - params_channels(hw_params)); - stream = substream->runtime->private_data = - &chip->dma_wt[substream->number]; - stream->dma = substream->number; - stream->substream = substream; - vortex_wtdma_setbuffers(chip, substream->number, - params_period_bytes(hw_params), - params_periods(hw_params)); - } -#endif - spin_unlock_irq(&chip->lock); - return 0; -} - -/* hw_free callback */ -static int snd_vortex_pcm_hw_free(struct snd_pcm_substream *substream) -{ - vortex_t *chip = snd_pcm_substream_chip(substream); - stream_t *stream = (stream_t *) (substream->runtime->private_data); - - spin_lock_irq(&chip->lock); - // Delete audio routes. - if (VORTEX_PCM_TYPE(substream->pcm) != VORTEX_PCM_WT) { - if (stream != NULL) { - if (VORTEX_PCM_TYPE(substream->pcm) == VORTEX_PCM_ADB) { - chip->pcm_vol[substream->number].active = 0; - vortex_notify_pcm_vol_change(chip->card, - chip->pcm_vol[substream->number].kctl, - 0); - } - vortex_adb_allocroute(chip, stream->dma, - stream->nr_ch, stream->dir, - stream->type, - substream->number); - } - } -#ifndef CHIP_AU8810 - else { - if (stream != NULL) - vortex_wt_allocroute(chip, stream->dma, 0); - } -#endif - substream->runtime->private_data = NULL; - spin_unlock_irq(&chip->lock); - - return snd_pcm_lib_free_pages(substream); -} - -/* prepare callback */ -static int snd_vortex_pcm_prepare(struct snd_pcm_substream *substream) -{ - vortex_t *chip = snd_pcm_substream_chip(substream); - struct snd_pcm_runtime *runtime = substream->runtime; - stream_t *stream = (stream_t *) substream->runtime->private_data; - int dma = stream->dma, fmt, dir; - - // set up the hardware with the current configuration. - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - dir = 1; - else - dir = 0; - fmt = vortex_alsafmt_aspfmt(runtime->format); - spin_lock_irq(&chip->lock); - if (VORTEX_PCM_TYPE(substream->pcm) != VORTEX_PCM_WT) { - vortex_adbdma_setmode(chip, dma, 1, dir, fmt, - runtime->channels == 1 ? 0 : 1, 0); - vortex_adbdma_setstartbuffer(chip, dma, 0); - if (VORTEX_PCM_TYPE(substream->pcm) != VORTEX_PCM_SPDIF) - vortex_adb_setsrc(chip, dma, runtime->rate, dir); - } -#ifndef CHIP_AU8810 - else { - vortex_wtdma_setmode(chip, dma, 1, fmt, 0, 0); - // FIXME: Set rate (i guess using vortex_wt_writereg() somehow). - vortex_wtdma_setstartbuffer(chip, dma, 0); - } -#endif - spin_unlock_irq(&chip->lock); - return 0; -} - -/* trigger callback */ -static int snd_vortex_pcm_trigger(struct snd_pcm_substream *substream, int cmd) -{ - vortex_t *chip = snd_pcm_substream_chip(substream); - stream_t *stream = (stream_t *) substream->runtime->private_data; - int dma = stream->dma; - - spin_lock(&chip->lock); - switch (cmd) { - case SNDRV_PCM_TRIGGER_START: - // do something to start the PCM engine - //printk(KERN_INFO "vortex: start %d\n", dma); - stream->fifo_enabled = 1; - if (VORTEX_PCM_TYPE(substream->pcm) != VORTEX_PCM_WT) { - vortex_adbdma_resetup(chip, dma); - vortex_adbdma_startfifo(chip, dma); - } -#ifndef CHIP_AU8810 - else { - printk(KERN_INFO "vortex: wt start %d\n", dma); - vortex_wtdma_startfifo(chip, dma); - } -#endif - break; - case SNDRV_PCM_TRIGGER_STOP: - // do something to stop the PCM engine - //printk(KERN_INFO "vortex: stop %d\n", dma); - stream->fifo_enabled = 0; - if (VORTEX_PCM_TYPE(substream->pcm) != VORTEX_PCM_WT) - vortex_adbdma_stopfifo(chip, dma); -#ifndef CHIP_AU8810 - else { - printk(KERN_INFO "vortex: wt stop %d\n", dma); - vortex_wtdma_stopfifo(chip, dma); - } -#endif - break; - case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - //printk(KERN_INFO "vortex: pause %d\n", dma); - if (VORTEX_PCM_TYPE(substream->pcm) != VORTEX_PCM_WT) - vortex_adbdma_pausefifo(chip, dma); -#ifndef CHIP_AU8810 - else - vortex_wtdma_pausefifo(chip, dma); -#endif - break; - case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: - //printk(KERN_INFO "vortex: resume %d\n", dma); - if (VORTEX_PCM_TYPE(substream->pcm) != VORTEX_PCM_WT) - vortex_adbdma_resumefifo(chip, dma); -#ifndef CHIP_AU8810 - else - vortex_wtdma_resumefifo(chip, dma); -#endif - break; - default: - spin_unlock(&chip->lock); - return -EINVAL; - } - spin_unlock(&chip->lock); - return 0; -} - -/* pointer callback */ -static snd_pcm_uframes_t snd_vortex_pcm_pointer(struct snd_pcm_substream *substream) -{ - vortex_t *chip = snd_pcm_substream_chip(substream); - stream_t *stream = (stream_t *) substream->runtime->private_data; - int dma = stream->dma; - snd_pcm_uframes_t current_ptr = 0; - - spin_lock(&chip->lock); - if (VORTEX_PCM_TYPE(substream->pcm) != VORTEX_PCM_WT) - current_ptr = vortex_adbdma_getlinearpos(chip, dma); -#ifndef CHIP_AU8810 - else - current_ptr = vortex_wtdma_getlinearpos(chip, dma); -#endif - //printk(KERN_INFO "vortex: pointer = 0x%x\n", current_ptr); - spin_unlock(&chip->lock); - return (bytes_to_frames(substream->runtime, current_ptr)); -} - -/* operators */ -static struct snd_pcm_ops snd_vortex_playback_ops = { - .open = snd_vortex_pcm_open, - .close = snd_vortex_pcm_close, - .ioctl = snd_pcm_lib_ioctl, - .hw_params = snd_vortex_pcm_hw_params, - .hw_free = snd_vortex_pcm_hw_free, - .prepare = snd_vortex_pcm_prepare, - .trigger = snd_vortex_pcm_trigger, - .pointer = snd_vortex_pcm_pointer, - .page = snd_pcm_sgbuf_ops_page, -}; - -/* -* definitions of capture are omitted here... -*/ - -static char *vortex_pcm_prettyname[VORTEX_PCM_LAST] = { - CARD_NAME " ADB", - CARD_NAME " SPDIF", - CARD_NAME " A3D", - CARD_NAME " WT", - CARD_NAME " I2S", -}; -static char *vortex_pcm_name[VORTEX_PCM_LAST] = { - "adb", - "spdif", - "a3d", - "wt", - "i2s", -}; - -/* SPDIF kcontrol */ - -static int snd_vortex_spdif_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958; - uinfo->count = 1; - return 0; -} - -static int snd_vortex_spdif_mask_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.iec958.status[0] = 0xff; - ucontrol->value.iec958.status[1] = 0xff; - ucontrol->value.iec958.status[2] = 0xff; - ucontrol->value.iec958.status[3] = IEC958_AES3_CON_FS; - return 0; -} - -static int snd_vortex_spdif_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) -{ - vortex_t *vortex = snd_kcontrol_chip(kcontrol); - ucontrol->value.iec958.status[0] = 0x00; - ucontrol->value.iec958.status[1] = IEC958_AES1_CON_ORIGINAL|IEC958_AES1_CON_DIGDIGCONV_ID; - ucontrol->value.iec958.status[2] = 0x00; - switch (vortex->spdif_sr) { - case 32000: ucontrol->value.iec958.status[3] = IEC958_AES3_CON_FS_32000; break; - case 44100: ucontrol->value.iec958.status[3] = IEC958_AES3_CON_FS_44100; break; - case 48000: ucontrol->value.iec958.status[3] = IEC958_AES3_CON_FS_48000; break; - } - return 0; -} - -static int snd_vortex_spdif_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) -{ - vortex_t *vortex = snd_kcontrol_chip(kcontrol); - int spdif_sr = 48000; - switch (ucontrol->value.iec958.status[3] & IEC958_AES3_CON_FS) { - case IEC958_AES3_CON_FS_32000: spdif_sr = 32000; break; - case IEC958_AES3_CON_FS_44100: spdif_sr = 44100; break; - case IEC958_AES3_CON_FS_48000: spdif_sr = 48000; break; - } - if (spdif_sr == vortex->spdif_sr) - return 0; - vortex->spdif_sr = spdif_sr; - vortex_spdif_init(vortex, vortex->spdif_sr, 1); - return 1; -} - -/* spdif controls */ -static struct snd_kcontrol_new snd_vortex_mixer_spdif[] __devinitdata = { - { - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,DEFAULT), - .info = snd_vortex_spdif_info, - .get = snd_vortex_spdif_get, - .put = snd_vortex_spdif_put, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,CON_MASK), - .info = snd_vortex_spdif_info, - .get = snd_vortex_spdif_mask_get - }, -}; - -/* subdevice PCM Volume control */ - -static int snd_vortex_pcm_vol_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - vortex_t *vortex = snd_kcontrol_chip(kcontrol); - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = (VORTEX_IS_QUAD(vortex) ? 4 : 2); - uinfo->value.integer.min = -128; - uinfo->value.integer.max = 32; - return 0; -} - -static int snd_vortex_pcm_vol_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int i; - vortex_t *vortex = snd_kcontrol_chip(kcontrol); - int subdev = kcontrol->id.subdevice; - struct pcm_vol *p = &vortex->pcm_vol[subdev]; - int max_chn = (VORTEX_IS_QUAD(vortex) ? 4 : 2); - for (i = 0; i < max_chn; i++) - ucontrol->value.integer.value[i] = p->vol[i]; - return 0; -} - -static int snd_vortex_pcm_vol_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int i; - int changed = 0; - int mixin; - unsigned char vol; - vortex_t *vortex = snd_kcontrol_chip(kcontrol); - int subdev = kcontrol->id.subdevice; - struct pcm_vol *p = &vortex->pcm_vol[subdev]; - int max_chn = (VORTEX_IS_QUAD(vortex) ? 4 : 2); - for (i = 0; i < max_chn; i++) { - if (p->vol[i] != ucontrol->value.integer.value[i]) { - p->vol[i] = ucontrol->value.integer.value[i]; - if (p->active) { - switch (vortex->dma_adb[p->dma].nr_ch) { - case 1: - mixin = p->mixin[0]; - break; - case 2: - default: - mixin = p->mixin[(i < 2) ? i : (i - 2)]; - break; - case 4: - mixin = p->mixin[i]; - break; - }; - vol = p->vol[i]; - vortex_mix_setinputvolumebyte(vortex, - vortex->mixplayb[i], mixin, vol); - } - changed = 1; - } - } - return changed; -} - -static const DECLARE_TLV_DB_MINMAX(vortex_pcm_vol_db_scale, -9600, 2400); - -static struct snd_kcontrol_new snd_vortex_pcm_vol __devinitdata = { - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = "PCM Playback Volume", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | - SNDRV_CTL_ELEM_ACCESS_TLV_READ | - SNDRV_CTL_ELEM_ACCESS_INACTIVE, - .info = snd_vortex_pcm_vol_info, - .get = snd_vortex_pcm_vol_get, - .put = snd_vortex_pcm_vol_put, - .tlv = { .p = vortex_pcm_vol_db_scale }, -}; - -/* create a pcm device */ -static int __devinit snd_vortex_new_pcm(vortex_t *chip, int idx, int nr) -{ - struct snd_pcm *pcm; - struct snd_kcontrol *kctl; - int i; - int err, nr_capt; - - if (!chip || idx < 0 || idx >= VORTEX_PCM_LAST) - return -ENODEV; - - /* idx indicates which kind of PCM device. ADB, SPDIF, I2S and A3D share the - * same dma engine. WT uses it own separate dma engine which can't capture. */ - if (idx == VORTEX_PCM_ADB) - nr_capt = nr; - else - nr_capt = 0; - err = snd_pcm_new(chip->card, vortex_pcm_prettyname[idx], idx, nr, - nr_capt, &pcm); - if (err < 0) - return err; - snprintf(pcm->name, sizeof(pcm->name), - "%s %s", CARD_NAME_SHORT, vortex_pcm_name[idx]); - chip->pcm[idx] = pcm; - // This is an evil hack, but it saves a lot of duplicated code. - VORTEX_PCM_TYPE(pcm) = idx; - pcm->private_data = chip; - /* set operators */ - snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, - &snd_vortex_playback_ops); - if (idx == VORTEX_PCM_ADB) - snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, - &snd_vortex_playback_ops); - - /* pre-allocation of Scatter-Gather buffers */ - - snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV_SG, - snd_dma_pci_data(chip->pci_dev), - 0x10000, 0x10000); - - if (VORTEX_PCM_TYPE(pcm) == VORTEX_PCM_SPDIF) { - for (i = 0; i < ARRAY_SIZE(snd_vortex_mixer_spdif); i++) { - kctl = snd_ctl_new1(&snd_vortex_mixer_spdif[i], chip); - if (!kctl) - return -ENOMEM; - if ((err = snd_ctl_add(chip->card, kctl)) < 0) - return err; - } - } - if (VORTEX_PCM_TYPE(pcm) == VORTEX_PCM_ADB) { - for (i = 0; i < NR_PCM; i++) { - chip->pcm_vol[i].active = 0; - chip->pcm_vol[i].dma = -1; - kctl = snd_ctl_new1(&snd_vortex_pcm_vol, chip); - if (!kctl) - return -ENOMEM; - chip->pcm_vol[i].kctl = kctl; - kctl->id.device = 0; - kctl->id.subdevice = i; - err = snd_ctl_add(chip->card, kctl); - if (err < 0) - return err; - } - } - return 0; -} diff --git a/ANDROID_3.4.5/sound/pci/au88x0/au88x0_synth.c b/ANDROID_3.4.5/sound/pci/au88x0/au88x0_synth.c deleted file mode 100644 index 2805e34b..00000000 --- a/ANDROID_3.4.5/sound/pci/au88x0/au88x0_synth.c +++ /dev/null @@ -1,418 +0,0 @@ -/* - * 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 Library 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. - */ - -/* - * Someday its supposed to make use of the WT DMA engine - * for a Wavetable synthesizer. - */ - -#include "au88x0.h" -#include "au88x0_wt.h" - -static void vortex_fifo_setwtvalid(vortex_t * vortex, int fifo, int en); -static void vortex_connection_adb_mixin(vortex_t * vortex, int en, - unsigned char channel, - unsigned char source, - unsigned char mixin); -static void vortex_connection_mixin_mix(vortex_t * vortex, int en, - unsigned char mixin, - unsigned char mix, int a); -static void vortex_fifo_wtinitialize(vortex_t * vortex, int fifo, int j); -static int vortex_wt_SetReg(vortex_t * vortex, unsigned char reg, int wt, - u32 val); - -/* WT */ - -/* Put 2 WT channels together for one stereo interlaced channel. */ -static void vortex_wt_setstereo(vortex_t * vortex, u32 wt, u32 stereo) -{ - int temp; - - //temp = hwread(vortex->mmio, 0x80 + ((wt >> 0x5)<< 0xf) + (((wt & 0x1f) >> 1) << 2)); - temp = hwread(vortex->mmio, WT_STEREO(wt)); - temp = (temp & 0xfe) | (stereo & 1); - //hwwrite(vortex->mmio, 0x80 + ((wt >> 0x5)<< 0xf) + (((wt & 0x1f) >> 1) << 2), temp); - hwwrite(vortex->mmio, WT_STEREO(wt), temp); -} - -/* Join to mixdown route. */ -static void vortex_wt_setdsout(vortex_t * vortex, u32 wt, int en) -{ - int temp; - - /* There is one DSREG register for each bank (32 voices each). */ - temp = hwread(vortex->mmio, WT_DSREG((wt >= 0x20) ? 1 : 0)); - if (en) - temp |= (1 << (wt & 0x1f)); - else - temp &= (1 << ~(wt & 0x1f)); - hwwrite(vortex->mmio, WT_DSREG((wt >= 0x20) ? 1 : 0), temp); -} - -/* Setup WT route. */ -static int vortex_wt_allocroute(vortex_t * vortex, int wt, int nr_ch) -{ - wt_voice_t *voice = &(vortex->wt_voice[wt]); - int temp; - - //FIXME: WT audio routing. - if (nr_ch) { - vortex_fifo_wtinitialize(vortex, wt, 1); - vortex_fifo_setwtvalid(vortex, wt, 1); - vortex_wt_setstereo(vortex, wt, nr_ch - 1); - } else - vortex_fifo_setwtvalid(vortex, wt, 0); - - /* Set mixdown mode. */ - vortex_wt_setdsout(vortex, wt, 1); - /* Set other parameter registers. */ - hwwrite(vortex->mmio, WT_SRAMP(0), 0x880000); - //hwwrite(vortex->mmio, WT_GMODE(0), 0xffffffff); -#ifdef CHIP_AU8830 - hwwrite(vortex->mmio, WT_SRAMP(1), 0x880000); - //hwwrite(vortex->mmio, WT_GMODE(1), 0xffffffff); -#endif - hwwrite(vortex->mmio, WT_PARM(wt, 0), 0); - hwwrite(vortex->mmio, WT_PARM(wt, 1), 0); - hwwrite(vortex->mmio, WT_PARM(wt, 2), 0); - - temp = hwread(vortex->mmio, WT_PARM(wt, 3)); - printk(KERN_DEBUG "vortex: WT PARM3: %x\n", temp); - //hwwrite(vortex->mmio, WT_PARM(wt, 3), temp); - - hwwrite(vortex->mmio, WT_DELAY(wt, 0), 0); - hwwrite(vortex->mmio, WT_DELAY(wt, 1), 0); - hwwrite(vortex->mmio, WT_DELAY(wt, 2), 0); - hwwrite(vortex->mmio, WT_DELAY(wt, 3), 0); - - printk(KERN_DEBUG "vortex: WT GMODE: %x\n", hwread(vortex->mmio, WT_GMODE(wt))); - - hwwrite(vortex->mmio, WT_PARM(wt, 2), 0xffffffff); - hwwrite(vortex->mmio, WT_PARM(wt, 3), 0xcff1c810); - - voice->parm0 = voice->parm1 = 0xcfb23e2f; - hwwrite(vortex->mmio, WT_PARM(wt, 0), voice->parm0); - hwwrite(vortex->mmio, WT_PARM(wt, 1), voice->parm1); - printk(KERN_DEBUG "vortex: WT GMODE 2 : %x\n", hwread(vortex->mmio, WT_GMODE(wt))); - return 0; -} - - -static void vortex_wt_connect(vortex_t * vortex, int en) -{ - int i, ii, mix; - -#define NR_WTROUTES 6 -#ifdef CHIP_AU8830 -#define NR_WTBLOCKS 2 -#else -#define NR_WTBLOCKS 1 -#endif - - for (i = 0; i < NR_WTBLOCKS; i++) { - for (ii = 0; ii < NR_WTROUTES; ii++) { - mix = - vortex_adb_checkinout(vortex, - vortex->fixed_res, en, - VORTEX_RESOURCE_MIXIN); - vortex->mixwt[(i * NR_WTROUTES) + ii] = mix; - - vortex_route(vortex, en, 0x11, - ADB_WTOUT(i, ii + 0x20), ADB_MIXIN(mix)); - - vortex_connection_mixin_mix(vortex, en, mix, - vortex->mixplayb[ii % 2], 0); - if (VORTEX_IS_QUAD(vortex)) - vortex_connection_mixin_mix(vortex, en, - mix, - vortex->mixplayb[2 + - (ii % 2)], 0); - } - } - for (i = 0; i < NR_WT; i++) { - hwwrite(vortex->mmio, WT_RUN(i), 1); - } -} - -/* Read WT Register */ -#if 0 -static int vortex_wt_GetReg(vortex_t * vortex, char reg, int wt) -{ - //int eax, esi; - - if (reg == 4) { - return hwread(vortex->mmio, WT_PARM(wt, 3)); - } - if (reg == 7) { - return hwread(vortex->mmio, WT_GMODE(wt)); - } - - return 0; -} - -/* WT hardware abstraction layer generic register interface. */ -static int -vortex_wt_SetReg2(vortex_t * vortex, unsigned char reg, int wt, - u16 val) -{ - /* - int eax, edx; - - if (wt >= NR_WT) // 0x40 -> NR_WT - return 0; - - if ((reg - 0x20) > 0) { - if ((reg - 0x21) != 0) - return 0; - eax = ((((b & 0xff) << 0xb) + (edx & 0xff)) << 4) + 0x208; // param 2 - } else { - eax = ((((b & 0xff) << 0xb) + (edx & 0xff)) << 4) + 0x20a; // param 3 - } - hwwrite(vortex->mmio, eax, c); - */ - return 1; -} - -/*public: static void __thiscall CWTHal::SetReg(unsigned char,int,unsigned long) */ -#endif -static int -vortex_wt_SetReg(vortex_t * vortex, unsigned char reg, int wt, - u32 val) -{ - int ecx; - - if ((reg == 5) || ((reg >= 7) && (reg <= 10)) || (reg == 0xc)) { - if (wt >= (NR_WT / NR_WT_PB)) { - printk - ("vortex: WT SetReg: bank out of range. reg=0x%x, wt=%d\n", - reg, wt); - return 0; - } - } else { - if (wt >= NR_WT) { - printk(KERN_ERR "vortex: WT SetReg: voice out of range\n"); - return 0; - } - } - if (reg > 0xc) - return 0; - - switch (reg) { - /* Voice specific parameters */ - case 0: /* running */ - /* - printk(KERN_DEBUG "vortex: WT SetReg(0x%x) = 0x%08x\n", - WT_RUN(wt), (int)val); - */ - hwwrite(vortex->mmio, WT_RUN(wt), val); - return 0xc; - break; - case 1: /* param 0 */ - /* - printk(KERN_DEBUG "vortex: WT SetReg(0x%x) = 0x%08x\n", - WT_PARM(wt,0), (int)val); - */ - hwwrite(vortex->mmio, WT_PARM(wt, 0), val); - return 0xc; - break; - case 2: /* param 1 */ - /* - printk(KERN_DEBUG "vortex: WT SetReg(0x%x) = 0x%08x\n", - WT_PARM(wt,1), (int)val); - */ - hwwrite(vortex->mmio, WT_PARM(wt, 1), val); - return 0xc; - break; - case 3: /* param 2 */ - /* - printk(KERN_DEBUG "vortex: WT SetReg(0x%x) = 0x%08x\n", - WT_PARM(wt,2), (int)val); - */ - hwwrite(vortex->mmio, WT_PARM(wt, 2), val); - return 0xc; - break; - case 4: /* param 3 */ - /* - printk(KERN_DEBUG "vortex: WT SetReg(0x%x) = 0x%08x\n", - WT_PARM(wt,3), (int)val); - */ - hwwrite(vortex->mmio, WT_PARM(wt, 3), val); - return 0xc; - break; - case 6: /* mute */ - /* - printk(KERN_DEBUG "vortex: WT SetReg(0x%x) = 0x%08x\n", - WT_MUTE(wt), (int)val); - */ - hwwrite(vortex->mmio, WT_MUTE(wt), val); - return 0xc; - break; - case 0xb: - { /* delay */ - /* - printk(KERN_DEBUG "vortex: WT SetReg(0x%x) = 0x%08x\n", - WT_DELAY(wt,0), (int)val); - */ - hwwrite(vortex->mmio, WT_DELAY(wt, 3), val); - hwwrite(vortex->mmio, WT_DELAY(wt, 2), val); - hwwrite(vortex->mmio, WT_DELAY(wt, 1), val); - hwwrite(vortex->mmio, WT_DELAY(wt, 0), val); - return 0xc; - } - break; - /* Global WT block parameters */ - case 5: /* sramp */ - ecx = WT_SRAMP(wt); - break; - case 8: /* aramp */ - ecx = WT_ARAMP(wt); - break; - case 9: /* mramp */ - ecx = WT_MRAMP(wt); - break; - case 0xa: /* ctrl */ - ecx = WT_CTRL(wt); - break; - case 0xc: /* ds_reg */ - ecx = WT_DSREG(wt); - break; - default: - return 0; - break; - } - /* - printk(KERN_DEBUG "vortex: WT SetReg(0x%x) = 0x%08x\n", ecx, (int)val); - */ - hwwrite(vortex->mmio, ecx, val); - return 1; -} - -static void vortex_wt_init(vortex_t * vortex) -{ - u32 var4, var8, varc, var10 = 0, edi; - - var10 &= 0xFFFFFFE3; - var10 |= 0x22; - var10 &= 0xFFFFFEBF; - var10 |= 0x80; - var10 |= 0x200; - var10 &= 0xfffffffe; - var10 &= 0xfffffbff; - var10 |= 0x1800; - // var10 = 0x1AA2 - var4 = 0x10000000; - varc = 0x00830000; - var8 = 0x00830000; - - /* Init Bank registers. */ - for (edi = 0; edi < (NR_WT / NR_WT_PB); edi++) { - vortex_wt_SetReg(vortex, 0xc, edi, 0); /* ds_reg */ - vortex_wt_SetReg(vortex, 0xa, edi, var10); /* ctrl */ - vortex_wt_SetReg(vortex, 0x9, edi, var4); /* mramp */ - vortex_wt_SetReg(vortex, 0x8, edi, varc); /* aramp */ - vortex_wt_SetReg(vortex, 0x5, edi, var8); /* sramp */ - } - /* Init Voice registers. */ - for (edi = 0; edi < NR_WT; edi++) { - vortex_wt_SetReg(vortex, 0x4, edi, 0); /* param 3 0x20c */ - vortex_wt_SetReg(vortex, 0x3, edi, 0); /* param 2 0x208 */ - vortex_wt_SetReg(vortex, 0x2, edi, 0); /* param 1 0x204 */ - vortex_wt_SetReg(vortex, 0x1, edi, 0); /* param 0 0x200 */ - vortex_wt_SetReg(vortex, 0xb, edi, 0); /* delay 0x400 - 0x40c */ - } - var10 |= 1; - for (edi = 0; edi < (NR_WT / NR_WT_PB); edi++) - vortex_wt_SetReg(vortex, 0xa, edi, var10); /* ctrl */ -} - -/* Extract of CAdbTopology::SetVolume(struct _ASPVOLUME *) */ -#if 0 -static void vortex_wt_SetVolume(vortex_t * vortex, int wt, int vol[]) -{ - wt_voice_t *voice = &(vortex->wt_voice[wt]); - int ecx = vol[1], eax = vol[0]; - - /* This is pure guess */ - voice->parm0 &= 0xff00ffff; - voice->parm0 |= (vol[0] & 0xff) << 0x10; - voice->parm1 &= 0xff00ffff; - voice->parm1 |= (vol[1] & 0xff) << 0x10; - - /* This is real */ - hwwrite(vortex, WT_PARM(wt, 0), voice->parm0); - hwwrite(vortex, WT_PARM(wt, 1), voice->parm0); - - if (voice->this_1D0 & 4) { - eax >>= 8; - ecx = eax; - if (ecx < 0x80) - ecx = 0x7f; - voice->parm3 &= 0xFFFFC07F; - voice->parm3 |= (ecx & 0x7f) << 7; - voice->parm3 &= 0xFFFFFF80; - voice->parm3 |= (eax & 0x7f); - } else { - voice->parm3 &= 0xFFE03FFF; - voice->parm3 |= (eax & 0xFE00) << 5; - } - - hwwrite(vortex, WT_PARM(wt, 3), voice->parm3); -} - -/* Extract of CAdbTopology::SetFrequency(unsigned long arg_0) */ -static void vortex_wt_SetFrequency(vortex_t * vortex, int wt, unsigned int sr) -{ - wt_voice_t *voice = &(vortex->wt_voice[wt]); - u32 eax, edx; - - //FIXME: 64 bit operation. - eax = ((sr << 0xf) * 0x57619F1) & 0xffffffff; - edx = (((sr << 0xf) * 0x57619F1)) >> 0x20; - - edx >>= 0xa; - edx <<= 1; - if (edx) { - if (edx & 0x0FFF80000) - eax = 0x7fff; - else { - edx <<= 0xd; - eax = 7; - while ((edx & 0x80000000) == 0) { - edx <<= 1; - eax--; - if (eax == 0) - break; - } - if (eax) - edx <<= 1; - eax <<= 0xc; - edx >>= 0x14; - eax |= edx; - } - } else - eax = 0; - voice->parm0 &= 0xffff0001; - voice->parm0 |= (eax & 0x7fff) << 1; - voice->parm1 = voice->parm0 | 1; - // Wt: this_1D4 - //AuWt::WriteReg((ulong)(this_1DC<<4)+0x200, (ulong)this_1E4); - //AuWt::WriteReg((ulong)(this_1DC<<4)+0x204, (ulong)this_1E8); - hwwrite(vortex->mmio, WT_PARM(wt, 0), voice->parm0); - hwwrite(vortex->mmio, WT_PARM(wt, 1), voice->parm1); -} -#endif - -/* End of File */ diff --git a/ANDROID_3.4.5/sound/pci/au88x0/au88x0_wt.h b/ANDROID_3.4.5/sound/pci/au88x0/au88x0_wt.h deleted file mode 100644 index 38d98f88..00000000 --- a/ANDROID_3.4.5/sound/pci/au88x0/au88x0_wt.h +++ /dev/null @@ -1,65 +0,0 @@ -/*************************************************************************** - * WT register offsets. - * - * Wed Oct 22 13:50:20 2003 - * Copyright 2003 mjander - * mjander@users.sourceforge.org - ****************************************************************************/ -#ifndef _AU88X0_WT_H -#define _AU88X0_WT_H - -/* WT channels are grouped in banks. Each bank has 0x20 channels. */ -/* Bank register address boundary is 0x8000 */ - -#define NR_WT_PB 0x20 - -/* WT bank base register (as dword address). */ -#define WT_BAR(x) (((x)&0xffe0)<<0x8) -#define WT_BANK(x) (x>>5) -/* WT Bank registers */ -#define WT_CTRL(bank) (((((bank)&1)<<0xd) + 0x00)<<2) /* 0x0000 */ -#define WT_SRAMP(bank) (((((bank)&1)<<0xd) + 0x01)<<2) /* 0x0004 */ -#define WT_DSREG(bank) (((((bank)&1)<<0xd) + 0x02)<<2) /* 0x0008 */ -#define WT_MRAMP(bank) (((((bank)&1)<<0xd) + 0x03)<<2) /* 0x000c */ -#define WT_GMODE(bank) (((((bank)&1)<<0xd) + 0x04)<<2) /* 0x0010 */ -#define WT_ARAMP(bank) (((((bank)&1)<<0xd) + 0x05)<<2) /* 0x0014 */ -/* WT Voice registers */ -#define WT_STEREO(voice) ((WT_BAR(voice)+ 0x20 +(((voice)&0x1f)>>1))<<2) /* 0x0080 */ -#define WT_MUTE(voice) ((WT_BAR(voice)+ 0x40 +((voice)&0x1f))<<2) /* 0x0100 */ -#define WT_RUN(voice) ((WT_BAR(voice)+ 0x60 +((voice)&0x1f))<<2) /* 0x0180 */ -/* Some kind of parameters. */ -/* PARM0, PARM1 : Filter (0xFF000000), SampleRate (0x0000FFFF) */ -/* PARM2, PARM3 : Still unknown */ -#define WT_PARM(x,y) (((WT_BAR(x))+ 0x80 +(((x)&0x1f)<<2)+(y))<<2) /* 0x0200 */ -#define WT_DELAY(x,y) (((WT_BAR(x))+ 0x100 +(((x)&0x1f)<<2)+(y))<<2) /* 0x0400 */ - -/* Numeric indexes used by SetReg() and GetReg() */ -#if 0 -enum { - run = 0, /* 0 W 1:run 0:stop */ - parm0, /* 1 W filter, samplerate */ - parm1, /* 2 W filter, samplerate */ - parm2, /* 3 W */ - parm3, /* 4 RW volume. This value is calculated using floating point ops. */ - sramp, /* 5 W */ - mute, /* 6 W 1:mute, 0:unmute */ - gmode, /* 7 RO Looks like only bit0 is used. */ - aramp, /* 8 W */ - mramp, /* 9 W */ - ctrl, /* a W */ - delay, /* b W All 4 values are written at once with same value. */ - dsreg, /* c (R)W */ -} wt_reg; -#endif - -typedef struct { - u32 parm0; /* this_1E4 */ - u32 parm1; /* this_1E8 */ - u32 parm2; /* this_1EC */ - u32 parm3; /* this_1F0 */ - u32 this_1D0; -} wt_voice_t; - -#endif /* _AU88X0_WT_H */ - -/* End of file */ diff --git a/ANDROID_3.4.5/sound/pci/au88x0/au88x0_xtalk.c b/ANDROID_3.4.5/sound/pci/au88x0/au88x0_xtalk.c deleted file mode 100644 index b278e285..00000000 --- a/ANDROID_3.4.5/sound/pci/au88x0/au88x0_xtalk.c +++ /dev/null @@ -1,795 +0,0 @@ -/*************************************************************************** - * au88x0_cxtalk.c - * - * Wed Nov 19 16:29:47 2003 - * Copyright 2003 mjander - * mjander@users.sourceforge.org - ****************************************************************************/ - -/* - * 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 Library 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. - */ - -#include "au88x0_xtalk.h" - -/* Data (a whole lot of data.... ) */ - -static short const sXtalkWideKLeftEq = 0x269C; -static short const sXtalkWideKRightEq = 0x269C; -static short const sXtalkWideKLeftXt = 0xF25E; -static short const sXtalkWideKRightXt = 0xF25E; -static short const sXtalkWideShiftLeftEq = 1; -static short const sXtalkWideShiftRightEq = 1; -static short const sXtalkWideShiftLeftXt = 0; -static short const sXtalkWideShiftRightXt = 0; -static unsigned short const wXtalkWideLeftDelay = 0xd; -static unsigned short const wXtalkWideRightDelay = 0xd; -static short const sXtalkNarrowKLeftEq = 0x468D; -static short const sXtalkNarrowKRightEq = 0x468D; -static short const sXtalkNarrowKLeftXt = 0xF82E; -static short const sXtalkNarrowKRightXt = 0xF82E; -static short const sXtalkNarrowShiftLeftEq = 0x3; -static short const sXtalkNarrowShiftRightEq = 0x3; -static short const sXtalkNarrowShiftLeftXt = 0; -static short const sXtalkNarrowShiftRightXt = 0; -static unsigned short const wXtalkNarrowLeftDelay = 0x7; -static unsigned short const wXtalkNarrowRightDelay = 0x7; - -static xtalk_gains_t const asXtalkGainsDefault = { - 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, - 0x4000, 0x4000, 0x4000, 0x4000, 0x4000 -}; - -static xtalk_gains_t const asXtalkGainsTest = { - 0x7fff, 0x8000, 0x0000, 0x0000, 0x0001, - 0xffff, 0x4000, 0xc000, 0x0002, 0xfffe -}; - -static xtalk_gains_t const asXtalkGains1Chan = { - 0x7FFF, 0, 0, 0, 0, - 0x7FFF, 0, 0, 0, 0, -}; - -// Input gain for 4 A3D slices. One possible input pair is left zero. -static xtalk_gains_t const asXtalkGainsAllChan = { - 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0, - 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0 -}; - -static xtalk_gains_t const asXtalkGainsZeros = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; - -static xtalk_dline_t const alXtalkDlineZeros = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; -static xtalk_dline_t const alXtalkDlineTest = { - 0x0000fc18, 0xfff03e8, 0x000186a0, 0xfffe7960, 1, 0xffffffff, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 -}; - -static xtalk_instate_t const asXtalkInStateZeros = { - 0, 0, 0, 0 -}; - -static xtalk_instate_t const asXtalkInStateTest = { - 0x0080, 0xff80, 0x0001, 0xffff -}; - -static xtalk_state_t const asXtalkOutStateZeros = { - {0, 0, 0, 0}, - {0, 0, 0, 0}, - {0, 0, 0, 0}, - {0, 0, 0, 0}, - {0, 0, 0, 0} -}; - -static short const sDiamondKLeftEq = 0x401d; -static short const sDiamondKRightEq = 0x401d; -static short const sDiamondKLeftXt = 0xF90E; -static short const sDiamondKRightXt = 0xF90E; -static short const sDiamondShiftLeftEq = 1; -static short const sDiamondShiftRightEq = 1; -static short const sDiamondShiftLeftXt = 0; -static short const sDiamondShiftRightXt = 0; -static unsigned short const wDiamondLeftDelay = 0xb; -static unsigned short const wDiamondRightDelay = 0xb; - -static xtalk_coefs_t const asXtalkWideCoefsLeftEq = { - {0xEC4C, 0xDCE9, 0xFDC2, 0xFEEC, 0}, - {0x5F60, 0xCBCB, 0xFC26, 0x0305, 0}, - {0x340B, 0xe8f5, 0x236c, 0xe40d, 0}, - {0x76d5, 0xc78d, 0x05ac, 0xfa5b, 0}, - {0x7F04, 0xC0FA, 0x0263, 0xFDA2, 0} -}; -static xtalk_coefs_t const asXtalkWideCoefsRightEq = { - {0xEC4C, 0xDCE9, 0xFDC2, 0xFEEC, 0}, - {0x5F60, 0xCBCB, 0xFC26, 0x0305, 0}, - {0x340B, 0xe8f5, 0x236c, 0xe40d, 0}, - {0x76d5, 0xc78d, 0x05ac, 0xfa5b, 0}, - {0x7F04, 0xC0FA, 0x0263, 0xFDA2, 0} -}; -static xtalk_coefs_t const asXtalkWideCoefsLeftXt = { - {0x55c6, 0xc97b, 0x005b, 0x0047, 0}, - {0x6a60, 0xca20, 0xffc6, 0x0040, 0}, - {0x6411, 0xd711, 0xfca1, 0x0190, 0}, - {0x77dc, 0xc79e, 0xffb8, 0x000a, 0}, - {0, 0, 0, 0, 0} -}; -static xtalk_coefs_t const asXtalkWideCoefsRightXt = { - {0x55c6, 0xc97b, 0x005b, 0x0047, 0}, - {0x6a60, 0xca20, 0xffc6, 0x0040, 0}, - {0x6411, 0xd711, 0xfca1, 0x0190, 0}, - {0x77dc, 0xc79e, 0xffb8, 0x000a, 0}, - {0, 0, 0, 0, 0} -}; -static xtalk_coefs_t const asXtalkNarrowCoefsLeftEq = { - {0x50B5, 0xD07C, 0x026D, 0xFD21, 0}, - {0x460F, 0xE44F, 0xF75E, 0xEFA6, 0}, - {0x556D, 0xDCAB, 0x2098, 0xF0F2, 0}, - {0x7E03, 0xC1F0, 0x007D, 0xFF89, 0}, - {0x383E, 0xFD9D, 0xB278, 0x4547, 0} -}; - -static xtalk_coefs_t const asXtalkNarrowCoefsRightEq = { - {0x50B5, 0xD07C, 0x026D, 0xFD21, 0}, - {0x460F, 0xE44F, 0xF75E, 0xEFA6, 0}, - {0x556D, 0xDCAB, 0x2098, 0xF0F2, 0}, - {0x7E03, 0xC1F0, 0x007D, 0xFF89, 0}, - {0x383E, 0xFD9D, 0xB278, 0x4547, 0} -}; - -static xtalk_coefs_t const asXtalkNarrowCoefsLeftXt = { - {0x3CB2, 0xDF49, 0xF6EA, 0x095B, 0}, - {0x6777, 0xC915, 0xFEAF, 0x00B1, 0}, - {0x7762, 0xC7D9, 0x025B, 0xFDA6, 0}, - {0x6B7A, 0xD2AA, 0xF2FB, 0x0B64, 0}, - {0, 0, 0, 0, 0} -}; - -static xtalk_coefs_t const asXtalkNarrowCoefsRightXt = { - {0x3CB2, 0xDF49, 0xF6EA, 0x095B, 0}, - {0x6777, 0xC915, 0xFEAF, 0x00B1, 0}, - {0x7762, 0xC7D9, 0x025B, 0xFDA6, 0}, - {0x6B7A, 0xD2AA, 0xF2FB, 0x0B64, 0}, - {0, 0, 0, 0, 0} -}; - -static xtalk_coefs_t const asXtalkCoefsZeros = { - {0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0} -}; - -static xtalk_coefs_t const asXtalkCoefsPipe = { - {0, 0, 0x0FA0, 0, 0}, - {0, 0, 0x0FA0, 0, 0}, - {0, 0, 0x0FA0, 0, 0}, - {0, 0, 0x0FA0, 0, 0}, - {0, 0, 0x1180, 0, 0}, -}; -static xtalk_coefs_t const asXtalkCoefsNegPipe = { - {0, 0, 0xF380, 0, 0}, - {0, 0, 0xF380, 0, 0}, - {0, 0, 0xF380, 0, 0}, - {0, 0, 0xF380, 0, 0}, - {0, 0, 0xF200, 0, 0} -}; - -static xtalk_coefs_t const asXtalkCoefsNumTest = { - {0, 0, 0xF380, 0x8000, 0x6D60}, - {0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0} -}; - -static xtalk_coefs_t const asXtalkCoefsDenTest = { - {0xC000, 0x2000, 0x4000, 0, 0}, - {0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0} -}; - -static xtalk_state_t const asXtalkOutStateTest = { - {0x7FFF, 0x0004, 0xFFFC, 0}, - {0xFE00, 0x0008, 0xFFF8, 0x4000}, - {0x0200, 0x0010, 0xFFF0, 0xC000}, - {0x8000, 0x0020, 0xFFE0, 0}, - {0, 0, 0, 0} -}; - -static xtalk_coefs_t const asDiamondCoefsLeftEq = { - {0x0F1E, 0x2D05, 0xF8E3, 0x07C8, 0}, - {0x45E2, 0xCA51, 0x0448, 0xFCE7, 0}, - {0xA93E, 0xDBD5, 0x022C, 0x028A, 0}, - {0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0} -}; - -static xtalk_coefs_t const asDiamondCoefsRightEq = { - {0x0F1E, 0x2D05, 0xF8E3, 0x07C8, 0}, - {0x45E2, 0xCA51, 0x0448, 0xFCE7, 0}, - {0xA93E, 0xDBD5, 0x022C, 0x028A, 0}, - {0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0} -}; - -static xtalk_coefs_t const asDiamondCoefsLeftXt = { - {0x3B50, 0xFE08, 0xF959, 0x0060, 0}, - {0x9FCB, 0xD8F1, 0x00A2, 0x003A, 0}, - {0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0} -}; - -static xtalk_coefs_t const asDiamondCoefsRightXt = { - {0x3B50, 0xFE08, 0xF959, 0x0060, 0}, - {0x9FCB, 0xD8F1, 0x00A2, 0x003A, 0}, - {0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0} -}; - - /**/ -/* XTalk EQ and XT */ -static void -vortex_XtalkHw_SetLeftEQ(vortex_t * vortex, short arg_0, short arg_4, - xtalk_coefs_t const coefs) -{ - int i; - - for (i = 0; i < 5; i++) { - hwwrite(vortex->mmio, 0x24200 + i * 0x24, coefs[i][0]); - hwwrite(vortex->mmio, 0x24204 + i * 0x24, coefs[i][1]); - hwwrite(vortex->mmio, 0x24208 + i * 0x24, coefs[i][2]); - hwwrite(vortex->mmio, 0x2420c + i * 0x24, coefs[i][3]); - hwwrite(vortex->mmio, 0x24210 + i * 0x24, coefs[i][4]); - } - hwwrite(vortex->mmio, 0x24538, arg_0 & 0xffff); - hwwrite(vortex->mmio, 0x2453C, arg_4 & 0xffff); -} - -static void -vortex_XtalkHw_SetRightEQ(vortex_t * vortex, short arg_0, short arg_4, - xtalk_coefs_t const coefs) -{ - int i; - - for (i = 0; i < 5; i++) { - hwwrite(vortex->mmio, 0x242b4 + i * 0x24, coefs[i][0]); - hwwrite(vortex->mmio, 0x242b8 + i * 0x24, coefs[i][1]); - hwwrite(vortex->mmio, 0x242bc + i * 0x24, coefs[i][2]); - hwwrite(vortex->mmio, 0x242c0 + i * 0x24, coefs[i][3]); - hwwrite(vortex->mmio, 0x242c4 + i * 0x24, coefs[i][4]); - } - hwwrite(vortex->mmio, 0x24540, arg_0 & 0xffff); - hwwrite(vortex->mmio, 0x24544, arg_4 & 0xffff); -} - -static void -vortex_XtalkHw_SetLeftXT(vortex_t * vortex, short arg_0, short arg_4, - xtalk_coefs_t const coefs) -{ - int i; - - for (i = 0; i < 5; i++) { - hwwrite(vortex->mmio, 0x24368 + i * 0x24, coefs[i][0]); - hwwrite(vortex->mmio, 0x2436c + i * 0x24, coefs[i][1]); - hwwrite(vortex->mmio, 0x24370 + i * 0x24, coefs[i][2]); - hwwrite(vortex->mmio, 0x24374 + i * 0x24, coefs[i][3]); - hwwrite(vortex->mmio, 0x24378 + i * 0x24, coefs[i][4]); - } - hwwrite(vortex->mmio, 0x24548, arg_0 & 0xffff); - hwwrite(vortex->mmio, 0x2454C, arg_4 & 0xffff); -} - -static void -vortex_XtalkHw_SetRightXT(vortex_t * vortex, short arg_0, short arg_4, - xtalk_coefs_t const coefs) -{ - int i; - - for (i = 0; i < 5; i++) { - hwwrite(vortex->mmio, 0x2441C + i * 0x24, coefs[i][0]); - hwwrite(vortex->mmio, 0x24420 + i * 0x24, coefs[i][1]); - hwwrite(vortex->mmio, 0x24424 + i * 0x24, coefs[i][2]); - hwwrite(vortex->mmio, 0x24428 + i * 0x24, coefs[i][3]); - hwwrite(vortex->mmio, 0x2442C + i * 0x24, coefs[i][4]); - } - hwwrite(vortex->mmio, 0x24550, arg_0 & 0xffff); - hwwrite(vortex->mmio, 0x24554, arg_4 & 0xffff); -} - -static void -vortex_XtalkHw_SetLeftEQStates(vortex_t * vortex, - xtalk_instate_t const arg_0, - xtalk_state_t const coefs) -{ - int i; - - for (i = 0; i < 5; i++) { - hwwrite(vortex->mmio, 0x24214 + i * 0x24, coefs[i][0]); - hwwrite(vortex->mmio, 0x24218 + i * 0x24, coefs[i][1]); - hwwrite(vortex->mmio, 0x2421C + i * 0x24, coefs[i][2]); - hwwrite(vortex->mmio, 0x24220 + i * 0x24, coefs[i][3]); - } - hwwrite(vortex->mmio, 0x244F8, arg_0[0]); - hwwrite(vortex->mmio, 0x244FC, arg_0[1]); - hwwrite(vortex->mmio, 0x24500, arg_0[2]); - hwwrite(vortex->mmio, 0x24504, arg_0[3]); -} - -static void -vortex_XtalkHw_SetRightEQStates(vortex_t * vortex, - xtalk_instate_t const arg_0, - xtalk_state_t const coefs) -{ - int i; - - for (i = 0; i < 5; i++) { - hwwrite(vortex->mmio, 0x242C8 + i * 0x24, coefs[i][0]); - hwwrite(vortex->mmio, 0x242CC + i * 0x24, coefs[i][1]); - hwwrite(vortex->mmio, 0x242D0 + i * 0x24, coefs[i][2]); - hwwrite(vortex->mmio, 0x244D4 + i * 0x24, coefs[i][3]); - } - hwwrite(vortex->mmio, 0x24508, arg_0[0]); - hwwrite(vortex->mmio, 0x2450C, arg_0[1]); - hwwrite(vortex->mmio, 0x24510, arg_0[2]); - hwwrite(vortex->mmio, 0x24514, arg_0[3]); -} - -static void -vortex_XtalkHw_SetLeftXTStates(vortex_t * vortex, - xtalk_instate_t const arg_0, - xtalk_state_t const coefs) -{ - int i; - - for (i = 0; i < 5; i++) { - hwwrite(vortex->mmio, 0x2437C + i * 0x24, coefs[i][0]); - hwwrite(vortex->mmio, 0x24380 + i * 0x24, coefs[i][1]); - hwwrite(vortex->mmio, 0x24384 + i * 0x24, coefs[i][2]); - hwwrite(vortex->mmio, 0x24388 + i * 0x24, coefs[i][3]); - } - hwwrite(vortex->mmio, 0x24518, arg_0[0]); - hwwrite(vortex->mmio, 0x2451C, arg_0[1]); - hwwrite(vortex->mmio, 0x24520, arg_0[2]); - hwwrite(vortex->mmio, 0x24524, arg_0[3]); -} - -static void -vortex_XtalkHw_SetRightXTStates(vortex_t * vortex, - xtalk_instate_t const arg_0, - xtalk_state_t const coefs) -{ - int i; - - for (i = 0; i < 5; i++) { - hwwrite(vortex->mmio, 0x24430 + i * 0x24, coefs[i][0]); - hwwrite(vortex->mmio, 0x24434 + i * 0x24, coefs[i][1]); - hwwrite(vortex->mmio, 0x24438 + i * 0x24, coefs[i][2]); - hwwrite(vortex->mmio, 0x2443C + i * 0x24, coefs[i][3]); - } - hwwrite(vortex->mmio, 0x24528, arg_0[0]); - hwwrite(vortex->mmio, 0x2452C, arg_0[1]); - hwwrite(vortex->mmio, 0x24530, arg_0[2]); - hwwrite(vortex->mmio, 0x24534, arg_0[3]); -} - -#if 0 -static void -vortex_XtalkHw_GetLeftEQ(vortex_t * vortex, short *arg_0, short *arg_4, - xtalk_coefs_t coefs) -{ - int i; - - for (i = 0; i < 5; i++) { - coefs[i][0] = hwread(vortex->mmio, 0x24200 + i * 0x24); - coefs[i][1] = hwread(vortex->mmio, 0x24204 + i * 0x24); - coefs[i][2] = hwread(vortex->mmio, 0x24208 + i * 0x24); - coefs[i][3] = hwread(vortex->mmio, 0x2420c + i * 0x24); - coefs[i][4] = hwread(vortex->mmio, 0x24210 + i * 0x24); - } - *arg_0 = hwread(vortex->mmio, 0x24538) & 0xffff; - *arg_4 = hwread(vortex->mmio, 0x2453c) & 0xffff; -} - -static void -vortex_XtalkHw_GetRightEQ(vortex_t * vortex, short *arg_0, short *arg_4, - xtalk_coefs_t coefs) -{ - int i; - - for (i = 0; i < 5; i++) { - coefs[i][0] = hwread(vortex->mmio, 0x242b4 + i * 0x24); - coefs[i][1] = hwread(vortex->mmio, 0x242b8 + i * 0x24); - coefs[i][2] = hwread(vortex->mmio, 0x242bc + i * 0x24); - coefs[i][3] = hwread(vortex->mmio, 0x242c0 + i * 0x24); - coefs[i][4] = hwread(vortex->mmio, 0x242c4 + i * 0x24); - } - *arg_0 = hwread(vortex->mmio, 0x24540) & 0xffff; - *arg_4 = hwread(vortex->mmio, 0x24544) & 0xffff; -} - -static void -vortex_XtalkHw_GetLeftXT(vortex_t * vortex, short *arg_0, short *arg_4, - xtalk_coefs_t coefs) -{ - int i; - - for (i = 0; i < 5; i++) { - coefs[i][0] = hwread(vortex->mmio, 0x24368 + i * 0x24); - coefs[i][1] = hwread(vortex->mmio, 0x2436C + i * 0x24); - coefs[i][2] = hwread(vortex->mmio, 0x24370 + i * 0x24); - coefs[i][3] = hwread(vortex->mmio, 0x24374 + i * 0x24); - coefs[i][4] = hwread(vortex->mmio, 0x24378 + i * 0x24); - } - *arg_0 = hwread(vortex->mmio, 0x24548) & 0xffff; - *arg_4 = hwread(vortex->mmio, 0x2454C) & 0xffff; -} - -static void -vortex_XtalkHw_GetRightXT(vortex_t * vortex, short *arg_0, short *arg_4, - xtalk_coefs_t coefs) -{ - int i; - - for (i = 0; i < 5; i++) { - coefs[i][0] = hwread(vortex->mmio, 0x2441C + i * 0x24); - coefs[i][1] = hwread(vortex->mmio, 0x24420 + i * 0x24); - coefs[i][2] = hwread(vortex->mmio, 0x24424 + i * 0x24); - coefs[i][3] = hwread(vortex->mmio, 0x24428 + i * 0x24); - coefs[i][4] = hwread(vortex->mmio, 0x2442C + i * 0x24); - } - *arg_0 = hwread(vortex->mmio, 0x24550) & 0xffff; - *arg_4 = hwread(vortex->mmio, 0x24554) & 0xffff; -} - -static void -vortex_XtalkHw_GetLeftEQStates(vortex_t * vortex, xtalk_instate_t arg_0, - xtalk_state_t coefs) -{ - int i; - - for (i = 0; i < 5; i++) { - coefs[i][0] = hwread(vortex->mmio, 0x24214 + i * 0x24); - coefs[i][1] = hwread(vortex->mmio, 0x24218 + i * 0x24); - coefs[i][2] = hwread(vortex->mmio, 0x2421C + i * 0x24); - coefs[i][3] = hwread(vortex->mmio, 0x24220 + i * 0x24); - } - arg_0[0] = hwread(vortex->mmio, 0x244F8); - arg_0[1] = hwread(vortex->mmio, 0x244FC); - arg_0[2] = hwread(vortex->mmio, 0x24500); - arg_0[3] = hwread(vortex->mmio, 0x24504); -} - -static void -vortex_XtalkHw_GetRightEQStates(vortex_t * vortex, xtalk_instate_t arg_0, - xtalk_state_t coefs) -{ - int i; - - for (i = 0; i < 5; i++) { - coefs[i][0] = hwread(vortex->mmio, 0x242C8 + i * 0x24); - coefs[i][1] = hwread(vortex->mmio, 0x242CC + i * 0x24); - coefs[i][2] = hwread(vortex->mmio, 0x242D0 + i * 0x24); - coefs[i][3] = hwread(vortex->mmio, 0x242D4 + i * 0x24); - } - arg_0[0] = hwread(vortex->mmio, 0x24508); - arg_0[1] = hwread(vortex->mmio, 0x2450C); - arg_0[2] = hwread(vortex->mmio, 0x24510); - arg_0[3] = hwread(vortex->mmio, 0x24514); -} - -static void -vortex_XtalkHw_GetLeftXTStates(vortex_t * vortex, xtalk_instate_t arg_0, - xtalk_state_t coefs) -{ - int i; - - for (i = 0; i < 5; i++) { - coefs[i][0] = hwread(vortex->mmio, 0x2437C + i * 0x24); - coefs[i][1] = hwread(vortex->mmio, 0x24380 + i * 0x24); - coefs[i][2] = hwread(vortex->mmio, 0x24384 + i * 0x24); - coefs[i][3] = hwread(vortex->mmio, 0x24388 + i * 0x24); - } - arg_0[0] = hwread(vortex->mmio, 0x24518); - arg_0[1] = hwread(vortex->mmio, 0x2451C); - arg_0[2] = hwread(vortex->mmio, 0x24520); - arg_0[3] = hwread(vortex->mmio, 0x24524); -} - -static void -vortex_XtalkHw_GetRightXTStates(vortex_t * vortex, xtalk_instate_t arg_0, - xtalk_state_t coefs) -{ - int i; - - for (i = 0; i < 5; i++) { - coefs[i][0] = hwread(vortex->mmio, 0x24430 + i * 0x24); - coefs[i][1] = hwread(vortex->mmio, 0x24434 + i * 0x24); - coefs[i][2] = hwread(vortex->mmio, 0x24438 + i * 0x24); - coefs[i][3] = hwread(vortex->mmio, 0x2443C + i * 0x24); - } - arg_0[0] = hwread(vortex->mmio, 0x24528); - arg_0[1] = hwread(vortex->mmio, 0x2452C); - arg_0[2] = hwread(vortex->mmio, 0x24530); - arg_0[3] = hwread(vortex->mmio, 0x24534); -} - -#endif -/* Gains */ - -static void -vortex_XtalkHw_SetGains(vortex_t * vortex, xtalk_gains_t const gains) -{ - int i; - - for (i = 0; i < XTGAINS_SZ; i++) { - hwwrite(vortex->mmio, 0x244D0 + (i * 4), gains[i]); - } -} - -static void -vortex_XtalkHw_SetGainsAllChan(vortex_t * vortex) -{ - vortex_XtalkHw_SetGains(vortex, asXtalkGainsAllChan); -} - -#if 0 -static void vortex_XtalkHw_GetGains(vortex_t * vortex, xtalk_gains_t gains) -{ - int i; - - for (i = 0; i < XTGAINS_SZ; i++) - gains[i] = hwread(vortex->mmio, 0x244D0 + i * 4); -} - -#endif -/* Delay parameters */ - -static void -vortex_XtalkHw_SetDelay(vortex_t * vortex, unsigned short right, - unsigned short left) -{ - u32 esp0 = 0; - - esp0 &= 0x1FFFFFFF; - esp0 |= 0xA0000000; - esp0 = (esp0 & 0xffffE0ff) | ((right & 0x1F) << 8); - esp0 = (esp0 & 0xfffc1fff) | ((left & 0x1F) << 0xd); - - hwwrite(vortex->mmio, 0x24660, esp0); -} - -static void -vortex_XtalkHw_SetLeftDline(vortex_t * vortex, xtalk_dline_t const dline) -{ - int i; - - for (i = 0; i < 0x20; i++) { - hwwrite(vortex->mmio, 0x24000 + (i << 2), dline[i] & 0xffff); - hwwrite(vortex->mmio, 0x24080 + (i << 2), dline[i] >> 0x10); - } -} - -static void -vortex_XtalkHw_SetRightDline(vortex_t * vortex, xtalk_dline_t const dline) -{ - int i; - - for (i = 0; i < 0x20; i++) { - hwwrite(vortex->mmio, 0x24100 + (i << 2), dline[i] & 0xffff); - hwwrite(vortex->mmio, 0x24180 + (i << 2), dline[i] >> 0x10); - } -} - -#if 0 -static void -vortex_XtalkHw_GetDelay(vortex_t * vortex, unsigned short *right, - unsigned short *left) -{ - int esp0; - - esp0 = hwread(vortex->mmio, 0x24660); - *right = (esp0 >> 8) & 0x1f; - *left = (esp0 >> 0xd) & 0x1f; -} - -static void vortex_XtalkHw_GetLeftDline(vortex_t * vortex, xtalk_dline_t dline) -{ - int i; - - for (i = 0; i < 0x20; i++) { - dline[i] = - (hwread(vortex->mmio, 0x24000 + (i << 2)) & 0xffff) | - (hwread(vortex->mmio, 0x24080 + (i << 2)) << 0x10); - } -} - -static void vortex_XtalkHw_GetRightDline(vortex_t * vortex, xtalk_dline_t dline) -{ - int i; - - for (i = 0; i < 0x20; i++) { - dline[i] = - (hwread(vortex->mmio, 0x24100 + (i << 2)) & 0xffff) | - (hwread(vortex->mmio, 0x24180 + (i << 2)) << 0x10); - } -} - -#endif -/* Control/Global stuff */ - -#if 0 -static void vortex_XtalkHw_SetControlReg(vortex_t * vortex, u32 ctrl) -{ - hwwrite(vortex->mmio, 0x24660, ctrl); -} -static void vortex_XtalkHw_GetControlReg(vortex_t * vortex, u32 *ctrl) -{ - *ctrl = hwread(vortex->mmio, 0x24660); -} -#endif -static void vortex_XtalkHw_SetSampleRate(vortex_t * vortex, u32 sr) -{ - u32 temp; - - temp = (hwread(vortex->mmio, 0x24660) & 0x1FFFFFFF) | 0xC0000000; - temp = (temp & 0xffffff07) | ((sr & 0x1f) << 3); - hwwrite(vortex->mmio, 0x24660, temp); -} - -#if 0 -static void vortex_XtalkHw_GetSampleRate(vortex_t * vortex, u32 *sr) -{ - *sr = (hwread(vortex->mmio, 0x24660) >> 3) & 0x1f; -} - -#endif -static void vortex_XtalkHw_Enable(vortex_t * vortex) -{ - u32 temp; - - temp = (hwread(vortex->mmio, 0x24660) & 0x1FFFFFFF) | 0xC0000000; - temp |= 1; - hwwrite(vortex->mmio, 0x24660, temp); - -} - -static void vortex_XtalkHw_Disable(vortex_t * vortex) -{ - u32 temp; - - temp = (hwread(vortex->mmio, 0x24660) & 0x1FFFFFFF) | 0xC0000000; - temp &= 0xfffffffe; - hwwrite(vortex->mmio, 0x24660, temp); - -} - -static void vortex_XtalkHw_ZeroIO(vortex_t * vortex) -{ - int i; - - for (i = 0; i < 20; i++) - hwwrite(vortex->mmio, 0x24600 + (i << 2), 0); - for (i = 0; i < 4; i++) - hwwrite(vortex->mmio, 0x24650 + (i << 2), 0); -} - -static void vortex_XtalkHw_ZeroState(vortex_t * vortex) -{ - vortex_XtalkHw_ZeroIO(vortex); // inlined - - vortex_XtalkHw_SetLeftEQ(vortex, 0, 0, asXtalkCoefsZeros); - vortex_XtalkHw_SetRightEQ(vortex, 0, 0, asXtalkCoefsZeros); - - vortex_XtalkHw_SetLeftXT(vortex, 0, 0, asXtalkCoefsZeros); - vortex_XtalkHw_SetRightXT(vortex, 0, 0, asXtalkCoefsZeros); - - vortex_XtalkHw_SetGains(vortex, asXtalkGainsZeros); // inlined - - vortex_XtalkHw_SetDelay(vortex, 0, 0); // inlined - - vortex_XtalkHw_SetLeftDline(vortex, alXtalkDlineZeros); // inlined - vortex_XtalkHw_SetRightDline(vortex, alXtalkDlineZeros); // inlined - vortex_XtalkHw_SetLeftDline(vortex, alXtalkDlineZeros); // inlined - vortex_XtalkHw_SetRightDline(vortex, alXtalkDlineZeros); // inlined - - vortex_XtalkHw_SetLeftEQStates(vortex, asXtalkInStateZeros, - asXtalkOutStateZeros); - vortex_XtalkHw_SetRightEQStates(vortex, asXtalkInStateZeros, - asXtalkOutStateZeros); - vortex_XtalkHw_SetLeftXTStates(vortex, asXtalkInStateZeros, - asXtalkOutStateZeros); - vortex_XtalkHw_SetRightXTStates(vortex, asXtalkInStateZeros, - asXtalkOutStateZeros); -} - -static void vortex_XtalkHw_ProgramPipe(vortex_t * vortex) -{ - - vortex_XtalkHw_SetLeftEQ(vortex, 0, 1, asXtalkCoefsPipe); - vortex_XtalkHw_SetRightEQ(vortex, 0, 1, asXtalkCoefsPipe); - vortex_XtalkHw_SetLeftXT(vortex, 0, 0, asXtalkCoefsZeros); - vortex_XtalkHw_SetRightXT(vortex, 0, 0, asXtalkCoefsZeros); - - vortex_XtalkHw_SetDelay(vortex, 0, 0); // inlined -} - -static void vortex_XtalkHw_ProgramXtalkWide(vortex_t * vortex) -{ - - vortex_XtalkHw_SetLeftEQ(vortex, sXtalkWideKLeftEq, - sXtalkWideShiftLeftEq, asXtalkWideCoefsLeftEq); - vortex_XtalkHw_SetRightEQ(vortex, sXtalkWideKRightEq, - sXtalkWideShiftRightEq, - asXtalkWideCoefsRightEq); - vortex_XtalkHw_SetLeftXT(vortex, sXtalkWideKLeftXt, - sXtalkWideShiftLeftXt, asXtalkWideCoefsLeftXt); - vortex_XtalkHw_SetRightXT(vortex, sXtalkWideKLeftXt, - sXtalkWideShiftLeftXt, - asXtalkWideCoefsLeftXt); - - vortex_XtalkHw_SetDelay(vortex, wXtalkWideRightDelay, wXtalkWideLeftDelay); // inlined -} - -static void vortex_XtalkHw_ProgramXtalkNarrow(vortex_t * vortex) -{ - - vortex_XtalkHw_SetLeftEQ(vortex, sXtalkNarrowKLeftEq, - sXtalkNarrowShiftLeftEq, - asXtalkNarrowCoefsLeftEq); - vortex_XtalkHw_SetRightEQ(vortex, sXtalkNarrowKRightEq, - sXtalkNarrowShiftRightEq, - asXtalkNarrowCoefsRightEq); - vortex_XtalkHw_SetLeftXT(vortex, sXtalkNarrowKLeftXt, - sXtalkNarrowShiftLeftXt, - asXtalkNarrowCoefsLeftXt); - vortex_XtalkHw_SetRightXT(vortex, sXtalkNarrowKLeftXt, - sXtalkNarrowShiftLeftXt, - asXtalkNarrowCoefsLeftXt); - - vortex_XtalkHw_SetDelay(vortex, wXtalkNarrowRightDelay, wXtalkNarrowLeftDelay); // inlined -} - -static void vortex_XtalkHw_ProgramDiamondXtalk(vortex_t * vortex) -{ - - //sDiamondKLeftEq,sDiamondKRightXt,asDiamondCoefsLeftEq - vortex_XtalkHw_SetLeftEQ(vortex, sDiamondKLeftEq, - sDiamondShiftLeftEq, asDiamondCoefsLeftEq); - vortex_XtalkHw_SetRightEQ(vortex, sDiamondKRightEq, - sDiamondShiftRightEq, asDiamondCoefsRightEq); - vortex_XtalkHw_SetLeftXT(vortex, sDiamondKLeftXt, - sDiamondShiftLeftXt, asDiamondCoefsLeftXt); - vortex_XtalkHw_SetRightXT(vortex, sDiamondKLeftXt, - sDiamondShiftLeftXt, asDiamondCoefsLeftXt); - - vortex_XtalkHw_SetDelay(vortex, wDiamondRightDelay, wDiamondLeftDelay); // inlined -} - -static void vortex_XtalkHw_init(vortex_t * vortex) -{ - vortex_XtalkHw_ZeroState(vortex); -} - -/* End of file */ diff --git a/ANDROID_3.4.5/sound/pci/au88x0/au88x0_xtalk.h b/ANDROID_3.4.5/sound/pci/au88x0/au88x0_xtalk.h deleted file mode 100644 index 7f4534b9..00000000 --- a/ANDROID_3.4.5/sound/pci/au88x0/au88x0_xtalk.h +++ /dev/null @@ -1,61 +0,0 @@ -/*************************************************************************** - * au88x0_cxtalk.h - * - * Wed Nov 19 19:07:17 2003 - * Copyright 2003 mjander - * mjander@users.sourceforge.org - ****************************************************************************/ - -/* - * 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 Library 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. - */ - -/* The crosstalk canceler supports 5 stereo input channels. The result is - available at one single output route pair (stereo). */ - -#ifndef _AU88X0_CXTALK_H -#define _AU88X0_CXTALK_H - -#include "au88x0.h" - -#define XTDLINE_SZ 32 -#define XTGAINS_SZ 10 -#define XTINST_SZ 4 - -#define XT_HEADPHONE 1 -#define XT_SPEAKER0 2 -#define XT_SPEAKER1 3 -#define XT_DIAMOND 4 - -typedef u32 xtalk_dline_t[XTDLINE_SZ]; -typedef u16 xtalk_gains_t[XTGAINS_SZ]; -typedef u16 xtalk_instate_t[XTINST_SZ]; -typedef u16 xtalk_coefs_t[5][5]; -typedef u16 xtalk_state_t[5][4]; - -static void vortex_XtalkHw_SetGains(vortex_t * vortex, - xtalk_gains_t const gains); -static void vortex_XtalkHw_SetGainsAllChan(vortex_t * vortex); -static void vortex_XtalkHw_SetSampleRate(vortex_t * vortex, u32 sr); -static void vortex_XtalkHw_ProgramPipe(vortex_t * vortex); -static void vortex_XtalkHw_ProgramPipe(vortex_t * vortex); -static void vortex_XtalkHw_ProgramXtalkWide(vortex_t * vortex); -static void vortex_XtalkHw_ProgramXtalkNarrow(vortex_t * vortex); -static void vortex_XtalkHw_ProgramDiamondXtalk(vortex_t * vortex); -static void vortex_XtalkHw_Enable(vortex_t * vortex); -static void vortex_XtalkHw_Disable(vortex_t * vortex); -static void vortex_XtalkHw_init(vortex_t * vortex); - -#endif /* _AU88X0_CXTALK_H */ |