Via 686 Audio Driver for Linux Jeff Garzik
jgarzik@mandrakesoft.com
2000 Jeff Garzik This documentation 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 For more details see the file COPYING in the source distribution of Linux.
Introduction The Via VT82C686A and VT82C686A "super southbridge" chips contain AC97-compatible audio logic which features dual full-duplex 16-bit stereo PCM sound channels, plus a third PCM channel intended for use in hardware-assisted FM synthesis. The current Linux kernel audio driver for this family of chips supports audio playback, but recording and hardware-assisted FM support features are not yet available. This driver supports any Linux kernel version after 2.3.50. Please send bug reports to the mailing list linux-via@gtf.org. To subscribe, e-mail majordomo@gtf.org with subscribe linux-via in the body of the message. Driver Installation To use this audio driver, select the CONFIG_SOUND_VIA82CXXX option in the section Sound during kernel configuration. Follow the usual kernel procedures for rebuilding the kernel, or building and installing driver modules. To make this driver the default audio driver, you can add the following to your /etc/conf.modules file: alias sound via82cxxx_audio Note that soundcore and ac97_codec support modules are also required for working audio, in addition to the via82cxxx_audio module itself. Submitting a bug report Description of problem Describe the application you were using to play/record sound, and how to reproduce the problem. Diagnostic output Obtain the via-audio-diag diagnostics program from http://gtf.org/garzik/drivers/via82cxxx/ and provide a dump of the audio chip's registers while the problem is occurring. Sample command line: ./via-audio-diag -aps > diag-output.txt Driver debug output Define VIA_DEBUG at the beginning of the driver, then capture and email the kernel log output. This can be viewed in the system kernel log (if enabled), or via the dmesg program. Sample command line: dmesg > /tmp/dmesg-output.txt Bigger kernel message buffer If you wish to increase the size of the buffer displayed by dmesg, then change the LOG_BUF_LEN macro at the top of linux/kernel/printk.c, recompile your kernel, and pass the LOG_BUF_LEN value to dmesg. Sample command line with LOG_BUF_LEN == 32768: dmesg -s 32768 > /tmp/dmesg-output.txt Known Bugs And Assumptions Recording support Recording support is currently missing. MMAP support MMAP support is currently missing. Make sure to test with Quake. AC97 codec timeout during init A warning message "via82cxxx: timeout while reading AC97 codec" is printed during driver initialization. This message can safely be ignored. Low volume Volume too low on many systems. Workaround: use mixer program such as xmixer to increase volume. RealPlayer trouble RealPlayer output very scratchy. Workaround: use esd, and configure RealPlayer to output to esd. Broken apps Applications which attempt to open the sound device in read/write mode (O_RDWR) will fail. This is incorrect OSS behavior, but since this driver will eventually support recording as well as playback, we will be able to (in the future) support even broken programs which unconditionally use O_RDWR. Thanks Via for providing e-mail support, specs, and NDA'd source code. MandrakeSoft for providing hacking time. AC97 mixer interface fixes and debugging by Ron Cemer roncemer@gte.net. Random Notes Two /proc pseudo-files provide diagnostic information. This is generally not useful to most users. Power users can disable VIA_PROC_FS macro in the driver source code, and remove the /proc support code. In any case, once version 2.0.0 is released, the /proc support code will be disabled by default. Available /proc pseudo-files: /proc/driver/via/0/info /proc/driver/via/0/ac97 This driver by default supports all PCI audio devices which report a vendor id of 0x1106, and a device id of 0x3058. Subsystem vendor and device ids are not examined. Only supports a single sound chip, as this is a motherboard chipset. Some architecture remains for multiple cards, feel free to submit a patch to clean some of that up. No consideration for SMP, this chipset is not known to be found on any SMP motherboards. However, spin_locks must be used anyway in order to handle interrupts correctly. GNU indent formatting options: -kr -i8 -pcs Via has graciously donated e-mail support and source code to help further the development of this driver. Their assistance has been invaluable in the design and coding of the next major version of this driver. The Via audio chip apparently provides a second PCM scatter-gather DMA channel just for FM data, but does not have a full hardware MIDI processor. I haven't put much thought towards a solution here, but it might involve using SoftOSS midi wave table, or simply disabling MIDI support altogether and using the FM PCM channel as a second (input? output?) Driver ChangeLog Version 1.1.8 Clean up interrupt handler output. Fixes the following kernel error message: unhandled interrupt ... Convert documentation to DocBook, so that PDF, HTML and PostScript (.ps) output is readily available. Version 1.1.7 Fix module unload bug where mixer device left registered after driver exit Version 1.1.6 Rewrite via_set_rate to mimic ALSA basic AC97 rate setting Remove much dead code Complete spin_lock_irqsave -> spin_lock_irq conversion in via_dsp_ioctl Fix build problem in via_dsp_ioctl Optimize included headers to eliminate headers found in linux/drivers/sound Version 1.1.5 Disable some overly-verbose debugging code Remove unnecessary sound locks Fix some ioctls for better time resolution Begin spin_lock_irqsave -> spin_lock_irq conversion in via_dsp_ioctl Version 1.1.4 Completed rewrite of driver. Eliminated SoundBlaster compatibility completely, and now uses the much-faster scatter-gather DMA engine. Internal Functions !Idrivers/sound/via82cxxx_audio.c