linux/drivers
Trent Piepho 05b2723387 V4L/DVB (6083): cx88-alsa: Rework buffer handling
Rework the way the DMA buffer is handled and IRQs are generated.

ALSA uses a ring-buffer of multiple periods.  Each period is supposed to
corrispond to one IRQ.

The existing driver was generating one interrupt per ring-buffer, as opposed
to per period.  This meant that as soon as the IRQ was generated, the hardware
was already starting to re-write the beginning of the buffer.  Since the DMA
happens on a per-line basis, there was only a narrow window to copy the data
out before the buffer was overwritten.

The cx88 core RISC program generator is modified so that it can set the IRQ
and counter flags to count every X lines of DMA transfer.  This way we can
generate an interrupt every period instead of every full ring-buffer.  Right
now only period of one line are supported, but it should be possible to
support longer periods.  Note that a WRITE instruction generates an IRQ when
it starts, not when the transfer is finished.  Thus to generate an IRQ when
line X is done, one must set the IRQ flag on the instruction that starts line
X+1, not the one that ends line X.

Change the line size so that there are four lines in the SRAM FIFO.  If there
are not four lines, the analog output from the cx88's internal DACs is full of
clicks and pops.

Try to handle FIFO sync errors.  Sometimes the chip generates many of these
errors before audio data starts.  Up to 50 sync errors will be ignored and the
counter reset.

Have the IRQ handler save the RISC counter to the chip struct, and then have
the pointer callback use this to calculate the pointer position.  We could
read the counter from the pointer callback, but sometimes the sync errors on
start up cause the counter to go crazy.  ALSA sees this and thinks there has
been an overrun.  The IRQ hander can avoid saving the counter position on
sync errors.

The chip "opened" flag wasn't necessary.  ALSA won't try to open the same
substream multiple times.  Probably this code was cut&pasted from the bt87x
driver, which has multiple sub-streams for one chip.

Do error checking for the videobuf mapping functions.

snd_card_cx88_runtime_free() is useless and can be deleted.

Signed-off-by: Trent Piepho <xyzzy@speakeasy.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
2007-10-09 22:06:34 -03:00
..
acorn/char
acpi ACPI: CONFIG_ACPI_SLEEP=n power off regression in 2.6.23-rc8 (NOT in rc7) 2007-09-25 17:58:52 -04:00
amba
ata sata_mv: correct S/G table limits 2007-10-09 12:38:26 -07:00
atm
auxdisplay
base Driver core: fix SYSF_DEPRECATED breakage for nested classdevs 2007-10-07 16:42:22 -07:00
block Fix "Fix DAC960 driver on machines which don't support 64-bit DMA" 2007-09-19 11:24:16 -07:00
bluetooth
cdrom cdrom_open() forgets to unlock on -EROFS failure exits 2007-09-26 08:20:44 +02:00
char Correct Makefile rule for generating custom keymap 2007-10-08 16:06:51 -07:00
clocksource
connector
cpufreq
crypto
dio
dma
edac drivers/edac: fix e752x correct return code 2007-09-11 17:21:19 -07:00
eisa
fc4
firewire firewire: point to migration document 2007-10-07 13:48:41 +02:00
firmware
hid
hwmon
i2c
ide Fix non-terminated PCI match table in PowerMac IDE 2007-10-06 09:32:56 -07:00
ieee1394 ieee1394: ohci1394: fix initialization if built non-modular 2007-09-20 21:19:45 +02:00
infiniband IB/mlx4: Fix data corruption triggered by wrong headroom marking order 2007-09-23 13:03:22 -07:00
input Input: xpad - fix dependancy on LEDS class 2007-09-28 15:38:12 -07:00
isdn ISDN: Fix data access out of array bounds 2007-10-08 13:01:21 -07:00
kvm KVM: Fix virtualization menu help text 2007-09-22 12:55:18 -07:00
leds
lguest fix modules oopsing in lguest guests 2007-09-25 08:51:04 -07:00
macintosh
mca
md raid5: fix 2 bugs in ops_complete_biofill 2007-09-24 13:23:35 -07:00
media V4L/DVB (6083): cx88-alsa: Rework buffer handling 2007-10-09 22:06:34 -03:00
message
mfd
misc Pull thinkpad into release branch 2007-09-17 00:58:40 -04:00
mmc bug in AT91 MCI suspend routines 2007-09-11 17:21:51 +02:00
mtd pci: fix unterminated pci_device_id lists 2007-09-19 11:24:17 -07:00
net r8169: revert part of 6dccd16b7c 2007-10-05 14:05:48 -04:00
nubus
of
oprofile
parisc
parport
pci Fix bogus PCI quirk for e100 2007-09-28 16:21:10 -07:00
pcmcia
pnp PNP: remove SMCf010 quirk 2007-09-11 17:21:19 -07:00
power [PATCH] missing null termination in power supply uevent 2007-09-21 01:22:23 +04:00
ps3
rapidio
rtc rtc: rtc-ds1553.c should use resource_size_t for base address 2007-09-19 11:24:17 -07:00
s390
sbus
scsi [SCSI] megaraid_old: fix READ_CAPACITY 2007-10-04 12:08:49 -04:00
serial Add manufacturer and card id of teltonica pcmcia modems 2007-10-07 16:28:43 -07:00
sh
sn
spi spi_mpc83xx: hang fix 2007-09-11 17:21:19 -07:00
tc
telephony
uio
usb Revert "usb-storage: implement autosuspend" 2007-09-13 06:01:24 -07:00
video intelfb: Fix bug in DPLL disable 2007-09-19 11:24:18 -07:00
w1 missing null termination in one wire uevent 2007-09-25 08:51:04 -07:00
xen
zorro
Kconfig
Makefile