From nobody Tue Jun 21 19:11:40 2022 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id AF8E286FF41; Tue, 21 Jun 2022 19:11:41 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4LSGMw5mD1z4c15; Tue, 21 Jun 2022 19:11:40 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1655838700; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=/5yIbabwmjSc6tMD/7r98kQlDaom9rX0ie0e82DVNoA=; b=rlUpEgHy3hMs8G3S7P47ymQvfB8A/85KCHzv5iLuEVc4VFc9MCjzCyJDVQ57WB8sEtUZfY qvKD424WXQUVv5I8soJTw2pMmNzCVs7tB2xdLZAqshwWfqJ6BOtYQqzCZxptGWDPSdJVxz Zg6jwZQ6VQXaOxmBVDA9C4TgiXBkNn6C6nbOemN61p5q8uugEjPqz4sRo+ExuGRJKhNw28 eWBfUGVN3UBj6zOiP4a+hXjDYsZFysis5+GImlsJ2Ah/27a4lK+OzmrPb8djshXsuBQ9lC nIdy7jWANUdW3Eke5R3Bom2JHePsihmk0q4BU9WHAUpj3JEPm0YbDhZrYLlT2Q== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4CA6D170FB; Tue, 21 Jun 2022 19:11:40 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 25LJBeJi073529; Tue, 21 Jun 2022 19:11:40 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 25LJBeKY073528; Tue, 21 Jun 2022 19:11:40 GMT (envelope-from git) Date: Tue, 21 Jun 2022 19:11:40 GMT Message-Id: <202206211911.25LJBeKY073528@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Ed Maste Subject: git: 716924cb4832 - main - Retire snd_sbc ISA sound card driver List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: emaste X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 716924cb4832ea0a440daf09913a06f3166f243e Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1655838700; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=/5yIbabwmjSc6tMD/7r98kQlDaom9rX0ie0e82DVNoA=; b=DSrV2nd59Opa82eoUM01f9Fp+PRmFYGeMOXhkvjEXJxjmb4x8EXyDmL4XxMQ558YTzqoZZ FxHOoeapkFokhKzBni0S/jOf4d3tDDl8QeE7KDyCROdGNp3bw4jMyLGclrQkADmb7v5DuJ Bs1IBP5wYgt20rAJ2vHicGO9t8blpeTw1EnXGl4w042BQ8q046Y54hN6LkIssPUi1TORpt MfMo58Qjg9DDceiSuzCyEe5Q4RZ2n27HJjv5hT5OKA+zQ5D09nXJZBR09TNTijqkUBf0qx Rie+MsmHmCFuQm1rLnB8Dtmk8I9EpLDt6M6aK1MUwcw3iMwOU9N43G9dZhKSMw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1655838700; a=rsa-sha256; cv=none; b=GL3QWYfTfqkscokvb83TINQAANYXC98MiWgH1eRrtBaQBD9s8bY8lOWQmz7B8sqzcbOBzW F3aSHb7TZpl9Dk2s0GhBgj5Dt+lySqdVuoUuVtz2devBg/wE+BnpHsi6QzMeZ2Evc303AZ zDSKRINjMW268BT39DEYOiWmDso54SV5A0+//fVgkuiEB5HC9nz43rTlUgwlIBUrvpiNZc jCBM9brNqpjYJVrDOpOcUYavF+yisopHSPPW7tRcRBTHiu+3Uol8j5swlfojW6tTaJlmJp +RNGKMeSCV4C1091OKRqxaDDwScAidEjG/0l9akQjqMzh81hN1pQGmkfHwatXQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by emaste: URL: https://cgit.FreeBSD.org/src/commit/?id=716924cb4832ea0a440daf09913a06f3166f243e commit 716924cb4832ea0a440daf09913a06f3166f243e Author: Ed Maste AuthorDate: 2022-06-21 18:50:04 +0000 Commit: Ed Maste CommitDate: 2022-06-21 18:50:04 +0000 Retire snd_sbc ISA sound card driver Along with the snd_sb8 and snd_sb16 drivers. They supported ISA Creative Sound Blaster and compatible sound cards. Note that isa/sb.h is not removed, as it is still used by some PCI sound card drivers. ISA sound card drivers are deprecated as discussed on the current[1] and stable[2] mailing lists. Deprecation notices were added in e39ec8933be4 and MFCd to stable branches. Driver removals are being committed individually so that specific drivers can be restored if necessary (either in FreeBSD or by downstream projects). [1] https://lists.freebsd.org/archives/freebsd-current/2022-March/001680.html [2] https://lists.freebsd.org/archives/freebsd-stable/2022-March/000585.html Reviewed by: mav Relnotes: Yes Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D34671 --- ObsoleteFiles.inc | 3 + share/man/man4/Makefile | 3 - share/man/man4/pcm.4 | 7 - share/man/man4/snd_sbc.4 | 135 ----- sys/conf/files | 3 - sys/dev/sound/driver.c | 3 - sys/dev/sound/isa/sb16.c | 912 --------------------------------- sys/dev/sound/isa/sb8.c | 803 ----------------------------- sys/dev/sound/isa/sbc.c | 752 --------------------------- sys/modules/sound/driver/Makefile | 2 +- sys/modules/sound/driver/sb16/Makefile | 9 - sys/modules/sound/driver/sb8/Makefile | 9 - sys/modules/sound/driver/sbc/Makefile | 11 - 13 files changed, 4 insertions(+), 2648 deletions(-) diff --git a/ObsoleteFiles.inc b/ObsoleteFiles.inc index 1d5ee5863b56..3b906ed221d2 100644 --- a/ObsoleteFiles.inc +++ b/ObsoleteFiles.inc @@ -58,6 +58,9 @@ OLD_FILES+=usr/share/man/man4/snd_ad1816.4 OLD_FILES+=usr/share/man/man4/snd_ess.4 OLD_FILES+=usr/share/man/man4/snd_gusc.4 OLD_FILES+=usr/share/man/man4/snd_mss.4 +OLD_FILES+=usr/share/man/man4/snd_sb16.4 +OLD_FILES+=usr/share/man/man4/snd_sb8.4 +OLD_FILES+=usr/share/man/man4/snd_sbc.4 # 20220612: new clang import which bumps version from 14.0.4 to 14.0.5 OLD_FILES+=usr/lib/clang/14.0.4/include/cuda_wrappers/algorithm diff --git a/share/man/man4/Makefile b/share/man/man4/Makefile index 00304c094987..613e823d4731 100644 --- a/share/man/man4/Makefile +++ b/share/man/man4/Makefile @@ -517,7 +517,6 @@ MAN= aac.4 \ snd_ich.4 \ snd_maestro3.4 \ snd_neomagic.4 \ - snd_sbc.4 \ snd_solo.4 \ snd_spicds.4 \ snd_t4dwave.4 \ @@ -737,8 +736,6 @@ MLINKS+=sk.4 if_sk.4 MLINKS+=smp.4 SMP.4 MLINKS+=smsc.4 if_smsc.4 MLINKS+=snd_envy24.4 snd_ak452x.4 -MLINKS+=snd_sbc.4 snd_sb16.4 \ - snd_sbc.4 snd_sb8.4 MLINKS+=${_spkr.4} ${_speaker.4} MLINKS+=splash.4 screensaver.4 MLINKS+=ste.4 if_ste.4 diff --git a/share/man/man4/pcm.4 b/share/man/man4/pcm.4 index b1ad16eece37..b4f55443f95c 100644 --- a/share/man/man4/pcm.4 +++ b/share/man/man4/pcm.4 @@ -111,12 +111,6 @@ The following bridge device drivers are available: .It .Xr snd_neomagic 4 .It -snd_sb16 -.It -snd_sb8 -.It -.Xr snd_sbc 4 -.It .Xr snd_solo 4 .It .Xr snd_spicds 4 @@ -708,7 +702,6 @@ A device node is not created properly. .Xr snd_ich 4 , .Xr snd_maestro3 4 , .Xr snd_neomagic 4 , -.Xr snd_sbc 4 , .Xr snd_solo 4 , .Xr snd_spicds 4 , .Xr snd_t4dwave 4 , diff --git a/share/man/man4/snd_sbc.4 b/share/man/man4/snd_sbc.4 deleted file mode 100644 index e15d23081fb7..000000000000 --- a/share/man/man4/snd_sbc.4 +++ /dev/null @@ -1,135 +0,0 @@ -.\" -.\" Copyright (c) 1999 Seigo Tanimura -.\" All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" $FreeBSD$ -.\" -.Dd March 19, 2022 -.Dt SND_SBC 4 -.Os -.Sh NAME -.Nm snd_sbc , -.Nm snd_sb16 , -.Nm snd_sb8 -.Nd Creative Sound Blaster ISA and compatible bridge device driver -.Sh DEPRECATION NOTICE -This driver is scheduled for removal prior to the release of -.Fx 14.0 . -.Sh SYNOPSIS -To compile this driver into the kernel, place the following lines in your -kernel configuration file: -.Bd -ragged -offset indent -.Cd "device sound" -.Cd "device snd_sbc" -.Cd "device snd_sb16" -.Cd "device snd_sb8" -.Ed -.Pp -Alternatively, to load the driver as a module at boot time, place the -following lines in -.Xr loader.conf 5 : -.Bd -literal -offset indent -snd_sbc_load="YES" -snd_sb16_load="YES" -snd_sb8_load="YES" -.Ed -.Pp -Non-PnP cards require the following lines in -.Xr device.hints 5 : -.Bd -literal -offset indent -hint.sbc.0.at="isa" -hint.sbc.0.port="0x220" -hint.sbc.0.irq="5" -hint.sbc.0.drq="1" -hint.sbc.0.flags="0x15" -.Ed -.Sh DESCRIPTION -The -.Nm -bridge driver allows the generic audio driver -.Xr sound 4 -to attach to Creative Sound Blaster ISA (mostly SB16 or SB8, known as -SoundBlaster Pro) compatible audio cards. -.Pp -The value of flags specifies the secondary DMA channel. -If the secondary -DMA channel is C, set the flags to (C | 0x10). -For a sound card without the -secondary DMA channel, the flags should be set to zero. -.Sh HARDWARE -The -.Nm -driver supports the following sound cards: -.Pp -.Bl -bullet -compact -.It -Avance Asound 110 -.It -Avance Logic ALS100+ -.It -Avance Logic ALS120 -.It -Creative SB16 -.It -Creative SB32 -.It -Creative AWE64 -.It -Creative AWE64 Gold -.It -Creative ViBRA16C -.It -Creative ViBRA16X -.It -ESS ES1681 -.It -ESS ES1688 -.It -ESS ES1868 -.It -ESS ES1869 -.It -ESS ES1878 -.It -ESS ES1879 -.It -ESS ES1888 -.El -.Sh DIAGNOSTICS -.Bl -diag -.It sb_dspwr(XX) timed out. -A command to the DSP has timed out. -Check the I/O port configuration. -.It bad irq XX (5/7/9/10 valid) -The IRQ given to the driver is not valid. -.El -.Sh SEE ALSO -.Xr sound 4 -.Sh HISTORY -The -.Nm -device driver first appeared in -.Fx 4.0 . -.Sh AUTHORS -.An Seigo Tanimura Aq Mt tanimura@r.dl.itc.u-tokyo.ac.jp diff --git a/sys/conf/files b/sys/conf/files index 28c2d3b69fe4..e2e0ca9759db 100644 --- a/sys/conf/files +++ b/sys/conf/files @@ -3089,9 +3089,6 @@ dev/smc/if_smc_fdt.c optional smc fdt dev/snp/snp.c optional snp dev/sound/clone.c optional sound dev/sound/unit.c optional sound -dev/sound/isa/sb16.c optional snd_sb16 isa -dev/sound/isa/sb8.c optional snd_sb8 isa -dev/sound/isa/sbc.c optional snd_sbc isa dev/sound/isa/sndbuf_dma.c optional sound isa dev/sound/pci/als4000.c optional snd_als4000 pci dev/sound/pci/atiixp.c optional snd_atiixp pci diff --git a/sys/dev/sound/driver.c b/sys/dev/sound/driver.c index ae26de6e8f7a..eb134d944e24 100644 --- a/sys/dev/sound/driver.c +++ b/sys/dev/sound/driver.c @@ -73,9 +73,6 @@ MODULE_DEPEND(snd_driver, snd_hda, 1, 1, 1); MODULE_DEPEND(snd_driver, snd_ich, 1, 1, 1); MODULE_DEPEND(snd_driver, snd_maestro3, 1, 1, 1); MODULE_DEPEND(snd_driver, snd_neomagic, 1, 1, 1); -MODULE_DEPEND(snd_driver, snd_sb16, 1, 1, 1); -MODULE_DEPEND(snd_driver, snd_sb8, 1, 1, 1); -MODULE_DEPEND(snd_driver, snd_sbc, 1, 1, 1); MODULE_DEPEND(snd_driver, snd_solo, 1, 1, 1); MODULE_DEPEND(snd_driver, snd_spicds, 1, 1, 1); MODULE_DEPEND(snd_driver, snd_t4dwave, 1, 1, 1); diff --git a/sys/dev/sound/isa/sb16.c b/sys/dev/sound/isa/sb16.c deleted file mode 100644 index cece651951ff..000000000000 --- a/sys/dev/sound/isa/sb16.c +++ /dev/null @@ -1,912 +0,0 @@ -/*- - * SPDX-License-Identifier: BSD-2-Clause-FreeBSD - * - * Copyright (c) 1999 Cameron Grant - * Copyright (c) 1997,1998 Luigi Rizzo - * - * Derived from files in the Voxware 3.5 distribution, - * Copyright by Hannu Savolainen 1994, under the same copyright - * conditions. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifdef HAVE_KERNEL_OPTION_HEADERS -#include "opt_snd.h" -#endif - -#include - -#include -#include - -#include - -#include "mixer_if.h" - -SND_DECLARE_FILE("$FreeBSD$"); - -#define SB16_BUFFSIZE 4096 -#define PLAIN_SB16(x) ((((x)->bd_flags) & (BD_F_SB16|BD_F_SB16X)) == BD_F_SB16) - -static u_int32_t sb16_fmt8[] = { - SND_FORMAT(AFMT_U8, 1, 0), - SND_FORMAT(AFMT_U8, 2, 0), - 0 -}; -static struct pcmchan_caps sb16_caps8 = {5000, 45000, sb16_fmt8, 0}; - -static u_int32_t sb16_fmt16[] = { - SND_FORMAT(AFMT_S16_LE, 1, 0), - SND_FORMAT(AFMT_S16_LE, 2, 0), - 0 -}; -static struct pcmchan_caps sb16_caps16 = {5000, 45000, sb16_fmt16, 0}; - -static u_int32_t sb16x_fmt[] = { - SND_FORMAT(AFMT_U8, 1, 0), - SND_FORMAT(AFMT_U8, 2, 0), - SND_FORMAT(AFMT_S16_LE, 1, 0), - SND_FORMAT(AFMT_S16_LE, 2, 0), - 0 -}; -static struct pcmchan_caps sb16x_caps = {5000, 49000, sb16x_fmt, 0}; - -struct sb_info; - -struct sb_chinfo { - struct sb_info *parent; - struct pcm_channel *channel; - struct snd_dbuf *buffer; - int dir, run, dch; - u_int32_t fmt, spd, blksz; -}; - -struct sb_info { - struct resource *io_base; /* I/O address for the board */ - struct resource *irq; - struct resource *drq1; - struct resource *drq2; - void *ih; - bus_dma_tag_t parent_dmat; - - unsigned int bufsize; - int bd_id; - u_long bd_flags; /* board-specific flags */ - int prio, prio16; - struct sb_chinfo pch, rch; - device_t parent_dev; -}; - -#if 0 -static void sb_lock(struct sb_info *sb); -static void sb_unlock(struct sb_info *sb); -static int sb_rd(struct sb_info *sb, int reg); -static void sb_wr(struct sb_info *sb, int reg, u_int8_t val); -static int sb_cmd(struct sb_info *sb, u_char val); -/* static int sb_cmd1(struct sb_info *sb, u_char cmd, int val); */ -static int sb_cmd2(struct sb_info *sb, u_char cmd, int val); -static u_int sb_get_byte(struct sb_info *sb); -static void sb_setmixer(struct sb_info *sb, u_int port, u_int value); -static int sb_getmixer(struct sb_info *sb, u_int port); -static int sb_reset_dsp(struct sb_info *sb); - -static void sb_intr(void *arg); -#endif - -/* - * Common code for the midi and pcm functions - * - * sb_cmd write a single byte to the CMD port. - * sb_cmd1 write a CMD + 1 byte arg - * sb_cmd2 write a CMD + 2 byte arg - * sb_get_byte returns a single byte from the DSP data port - */ - -static void -sb_lock(struct sb_info *sb) { - sbc_lock(device_get_softc(sb->parent_dev)); -} - -static void -sb_lockassert(struct sb_info *sb) { - sbc_lockassert(device_get_softc(sb->parent_dev)); -} - -static void -sb_unlock(struct sb_info *sb) { - sbc_unlock(device_get_softc(sb->parent_dev)); -} - -static int -port_rd(struct resource *port, int off) -{ - return bus_space_read_1(rman_get_bustag(port), rman_get_bushandle(port), off); -} - -static void -port_wr(struct resource *port, int off, u_int8_t data) -{ - bus_space_write_1(rman_get_bustag(port), rman_get_bushandle(port), off, data); -} - -static int -sb_rd(struct sb_info *sb, int reg) -{ - return port_rd(sb->io_base, reg); -} - -static void -sb_wr(struct sb_info *sb, int reg, u_int8_t val) -{ - port_wr(sb->io_base, reg, val); -} - -static int -sb_dspwr(struct sb_info *sb, u_char val) -{ - int i; - - for (i = 0; i < 1000; i++) { - if ((sb_rd(sb, SBDSP_STATUS) & 0x80)) - DELAY((i > 100)? 1000 : 10); - else { - sb_wr(sb, SBDSP_CMD, val); - return 1; - } - } - if (curthread->td_intr_nesting_level == 0) - printf("sb_dspwr(0x%02x) timed out.\n", val); - return 0; -} - -static int -sb_cmd(struct sb_info *sb, u_char val) -{ -#if 0 - printf("sb_cmd: %x\n", val); -#endif - return sb_dspwr(sb, val); -} - -/* -static int -sb_cmd1(struct sb_info *sb, u_char cmd, int val) -{ -#if 0 - printf("sb_cmd1: %x, %x\n", cmd, val); -#endif - if (sb_dspwr(sb, cmd)) { - return sb_dspwr(sb, val & 0xff); - } else return 0; -} -*/ - -static int -sb_cmd2(struct sb_info *sb, u_char cmd, int val) -{ - int r; - -#if 0 - printf("sb_cmd2: %x, %x\n", cmd, val); -#endif - sb_lockassert(sb); - r = 0; - if (sb_dspwr(sb, cmd)) { - if (sb_dspwr(sb, val & 0xff)) { - if (sb_dspwr(sb, (val >> 8) & 0xff)) { - r = 1; - } - } - } - - return r; -} - -/* - * in the SB, there is a set of indirect "mixer" registers with - * address at offset 4, data at offset 5 - */ -static void -sb_setmixer(struct sb_info *sb, u_int port, u_int value) -{ - sb_lock(sb); - sb_wr(sb, SB_MIX_ADDR, (u_char) (port & 0xff)); /* Select register */ - DELAY(10); - sb_wr(sb, SB_MIX_DATA, (u_char) (value & 0xff)); - DELAY(10); - sb_unlock(sb); -} - -static int -sb_getmixer(struct sb_info *sb, u_int port) -{ - int val; - - sb_lockassert(sb); - sb_wr(sb, SB_MIX_ADDR, (u_char) (port & 0xff)); /* Select register */ - DELAY(10); - val = sb_rd(sb, SB_MIX_DATA); - DELAY(10); - - return val; -} - -static u_int -sb_get_byte(struct sb_info *sb) -{ - int i; - - for (i = 1000; i > 0; i--) { - if (sb_rd(sb, DSP_DATA_AVAIL) & 0x80) - return sb_rd(sb, DSP_READ); - else - DELAY(20); - } - return 0xffff; -} - -static int -sb_reset_dsp(struct sb_info *sb) -{ - u_char b; - - sb_lockassert(sb); - sb_wr(sb, SBDSP_RST, 3); - DELAY(100); - sb_wr(sb, SBDSP_RST, 0); - b = sb_get_byte(sb); - if (b != 0xAA) { - DEB(printf("sb_reset_dsp 0x%lx failed\n", - rman_get_start(sb->io_base))); - return ENXIO; /* Sorry */ - } - return 0; -} - -/************************************************************/ - -struct sb16_mixent { - int reg; - int bits; - int ofs; - int stereo; -}; - -static const struct sb16_mixent sb16_mixtab[32] = { - [SOUND_MIXER_VOLUME] = { 0x30, 5, 3, 1 }, - [SOUND_MIXER_PCM] = { 0x32, 5, 3, 1 }, - [SOUND_MIXER_SYNTH] = { 0x34, 5, 3, 1 }, - [SOUND_MIXER_CD] = { 0x36, 5, 3, 1 }, - [SOUND_MIXER_LINE] = { 0x38, 5, 3, 1 }, - [SOUND_MIXER_MIC] = { 0x3a, 5, 3, 0 }, - [SOUND_MIXER_SPEAKER] = { 0x3b, 5, 3, 0 }, - [SOUND_MIXER_IGAIN] = { 0x3f, 2, 6, 1 }, - [SOUND_MIXER_OGAIN] = { 0x41, 2, 6, 1 }, - [SOUND_MIXER_TREBLE] = { 0x44, 4, 4, 1 }, - [SOUND_MIXER_BASS] = { 0x46, 4, 4, 1 }, - [SOUND_MIXER_LINE1] = { 0x52, 5, 3, 1 } -}; - -static int -sb16mix_init(struct snd_mixer *m) -{ - struct sb_info *sb = mix_getdevinfo(m); - - mix_setdevs(m, SOUND_MASK_SYNTH | SOUND_MASK_PCM | SOUND_MASK_SPEAKER | - SOUND_MASK_LINE | SOUND_MASK_MIC | SOUND_MASK_CD | - SOUND_MASK_IGAIN | SOUND_MASK_OGAIN | SOUND_MASK_LINE1 | - SOUND_MASK_VOLUME | SOUND_MASK_BASS | SOUND_MASK_TREBLE); - - mix_setrecdevs(m, SOUND_MASK_SYNTH | SOUND_MASK_LINE | - SOUND_MASK_LINE1 | SOUND_MASK_MIC | SOUND_MASK_CD); - - sb_setmixer(sb, 0x3c, 0x1f); /* make all output active */ - - sb_setmixer(sb, 0x3d, 0); /* make all inputs-l off */ - sb_setmixer(sb, 0x3e, 0); /* make all inputs-r off */ - - return 0; -} - -static int -rel2abs_volume(int x, int max) -{ - int temp; - - temp = ((x * max) + 50) / 100; - if (temp > max) - temp = max; - else if (temp < 0) - temp = 0; - return (temp); -} - -static int -sb16mix_set(struct snd_mixer *m, unsigned dev, unsigned left, unsigned right) -{ - struct sb_info *sb = mix_getdevinfo(m); - const struct sb16_mixent *e; - int max; - - e = &sb16_mixtab[dev]; - max = (1 << e->bits) - 1; - - left = rel2abs_volume(left, max); - right = rel2abs_volume(right, max); - - sb_setmixer(sb, e->reg, left << e->ofs); - if (e->stereo) - sb_setmixer(sb, e->reg + 1, right << e->ofs); - else - right = left; - - left = (left * 100) / max; - right = (right * 100) / max; - - return left | (right << 8); -} - -static u_int32_t -sb16mix_setrecsrc(struct snd_mixer *m, u_int32_t src) -{ - struct sb_info *sb = mix_getdevinfo(m); - u_char recdev_l, recdev_r; - - recdev_l = 0; - recdev_r = 0; - if (src & SOUND_MASK_MIC) { - recdev_l |= 0x01; /* mono mic */ - recdev_r |= 0x01; - } - - if (src & SOUND_MASK_CD) { - recdev_l |= 0x04; /* l cd */ - recdev_r |= 0x02; /* r cd */ - } - - if (src & SOUND_MASK_LINE) { - recdev_l |= 0x10; /* l line */ - recdev_r |= 0x08; /* r line */ - } - - if (src & SOUND_MASK_SYNTH) { - recdev_l |= 0x40; /* l midi */ - recdev_r |= 0x20; /* r midi */ - } - - sb_setmixer(sb, SB16_IMASK_L, recdev_l); - sb_setmixer(sb, SB16_IMASK_R, recdev_r); - - /* Switch on/off FM tuner source */ - if (src & SOUND_MASK_LINE1) - sb_setmixer(sb, 0x4a, 0x0c); - else - sb_setmixer(sb, 0x4a, 0x00); - - /* - * since the same volume controls apply to the input and - * output sections, the best approach to have a consistent - * behaviour among cards would be to disable the output path - * on devices which are used to record. - * However, since users like to have feedback, we only disable - * the mic -- permanently. - */ - sb_setmixer(sb, SB16_OMASK, 0x1f & ~1); - - return src; -} - -static kobj_method_t sb16mix_mixer_methods[] = { - KOBJMETHOD(mixer_init, sb16mix_init), - KOBJMETHOD(mixer_set, sb16mix_set), - KOBJMETHOD(mixer_setrecsrc, sb16mix_setrecsrc), - KOBJMETHOD_END -}; -MIXER_DECLARE(sb16mix_mixer); - -/************************************************************/ - -static void -sb16_release_resources(struct sb_info *sb, device_t dev) -{ - if (sb->irq) { - if (sb->ih) - bus_teardown_intr(dev, sb->irq, sb->ih); - bus_release_resource(dev, SYS_RES_IRQ, 0, sb->irq); - sb->irq = NULL; - } - if (sb->drq2) { - if (sb->drq2 != sb->drq1) { - isa_dma_release(rman_get_start(sb->drq2)); - bus_release_resource(dev, SYS_RES_DRQ, 1, sb->drq2); - } - sb->drq2 = NULL; - } - if (sb->drq1) { - isa_dma_release(rman_get_start(sb->drq1)); - bus_release_resource(dev, SYS_RES_DRQ, 0, sb->drq1); - sb->drq1 = NULL; - } - if (sb->io_base) { - bus_release_resource(dev, SYS_RES_IOPORT, 0, sb->io_base); - sb->io_base = NULL; - } - if (sb->parent_dmat) { - bus_dma_tag_destroy(sb->parent_dmat); - sb->parent_dmat = 0; - } - free(sb, M_DEVBUF); -} - -static int -sb16_alloc_resources(struct sb_info *sb, device_t dev) -{ - int rid; - - rid = 0; - if (!sb->io_base) - sb->io_base = bus_alloc_resource_any(dev, SYS_RES_IOPORT, - &rid, RF_ACTIVE); - - rid = 0; - if (!sb->irq) - sb->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, - RF_ACTIVE); - - rid = 0; - if (!sb->drq1) - sb->drq1 = bus_alloc_resource_any(dev, SYS_RES_DRQ, &rid, - RF_ACTIVE); - - rid = 1; - if (!sb->drq2) - sb->drq2 = bus_alloc_resource_any(dev, SYS_RES_DRQ, &rid, - RF_ACTIVE); - - if (sb->io_base && sb->drq1 && sb->irq) { - isa_dma_acquire(rman_get_start(sb->drq1)); - isa_dmainit(rman_get_start(sb->drq1), sb->bufsize); - - if (sb->drq2) { - isa_dma_acquire(rman_get_start(sb->drq2)); - isa_dmainit(rman_get_start(sb->drq2), sb->bufsize); - } else { - sb->drq2 = sb->drq1; - pcm_setflags(dev, pcm_getflags(dev) | SD_F_SIMPLEX); - } - return 0; - } else return ENXIO; -} - -/* sbc does locking for us */ -static void -sb_intr(void *arg) -{ - struct sb_info *sb = (struct sb_info *)arg; - int reason, c; - - /* - * The Vibra16X has separate flags for 8 and 16 bit transfers, but - * I have no idea how to tell capture from playback interrupts... - */ - - reason = 0; - sb_lock(sb); - c = sb_getmixer(sb, IRQ_STAT); - if (c & 1) - sb_rd(sb, DSP_DATA_AVAIL); /* 8-bit int ack */ - - if (c & 2) - sb_rd(sb, DSP_DATA_AVL16); /* 16-bit int ack */ - sb_unlock(sb); - - /* - * this tells us if the source is 8-bit or 16-bit dma. We - * have to check the io channel to map it to read or write... - */ - - if (sb->bd_flags & BD_F_SB16X) { - if (c & 1) { /* 8-bit format */ - if (sb->pch.fmt & AFMT_8BIT) - reason |= 1; - if (sb->rch.fmt & AFMT_8BIT) - reason |= 2; - } - if (c & 2) { /* 16-bit format */ - if (sb->pch.fmt & AFMT_16BIT) - reason |= 1; - if (sb->rch.fmt & AFMT_16BIT) - reason |= 2; - } - } else { - if (c & 1) { /* 8-bit dma */ - if (sb->pch.dch == 1) - reason |= 1; - if (sb->rch.dch == 1) - reason |= 2; - } - if (c & 2) { /* 16-bit dma */ - if (sb->pch.dch == 2) - reason |= 1; - if (sb->rch.dch == 2) - reason |= 2; - } - } -#if 0 - printf("sb_intr: reason=%d c=0x%x\n", reason, c); -#endif - if ((reason & 1) && (sb->pch.run)) - chn_intr(sb->pch.channel); - - if ((reason & 2) && (sb->rch.run)) - chn_intr(sb->rch.channel); -} - -static int -sb_setup(struct sb_info *sb) -{ - struct sb_chinfo *ch; - u_int8_t v; - int l, pprio; - - sb_lock(sb); - if (sb->bd_flags & BD_F_DMARUN) - sndbuf_dma(sb->pch.buffer, PCMTRIG_STOP); - if (sb->bd_flags & BD_F_DMARUN2) - sndbuf_dma(sb->rch.buffer, PCMTRIG_STOP); - sb->bd_flags &= ~(BD_F_DMARUN | BD_F_DMARUN2); - - sb_reset_dsp(sb); - - if (sb->bd_flags & BD_F_SB16X) { - /* full-duplex doesn't work! */ - pprio = sb->pch.run? 1 : 0; - sndbuf_dmasetup(sb->pch.buffer, pprio? sb->drq1 : sb->drq2); - sb->pch.dch = pprio? 1 : 0; - sndbuf_dmasetup(sb->rch.buffer, pprio? sb->drq2 : sb->drq1); - sb->rch.dch = pprio? 2 : 1; - } else { - if (sb->pch.run && sb->rch.run) { - pprio = (sb->rch.fmt & AFMT_16BIT)? 0 : 1; - sndbuf_dmasetup(sb->pch.buffer, pprio? sb->drq2 : sb->drq1); - sb->pch.dch = pprio? 2 : 1; - sndbuf_dmasetup(sb->rch.buffer, pprio? sb->drq1 : sb->drq2); - sb->rch.dch = pprio? 1 : 2; - } else { - if (sb->pch.run) { - sndbuf_dmasetup(sb->pch.buffer, (sb->pch.fmt & AFMT_16BIT)? sb->drq2 : sb->drq1); - sb->pch.dch = (sb->pch.fmt & AFMT_16BIT)? 2 : 1; - sndbuf_dmasetup(sb->rch.buffer, (sb->pch.fmt & AFMT_16BIT)? sb->drq1 : sb->drq2); - sb->rch.dch = (sb->pch.fmt & AFMT_16BIT)? 1 : 2; - } else if (sb->rch.run) { - sndbuf_dmasetup(sb->pch.buffer, (sb->rch.fmt & AFMT_16BIT)? sb->drq1 : sb->drq2); - sb->pch.dch = (sb->rch.fmt & AFMT_16BIT)? 1 : 2; - sndbuf_dmasetup(sb->rch.buffer, (sb->rch.fmt & AFMT_16BIT)? sb->drq2 : sb->drq1); - sb->rch.dch = (sb->rch.fmt & AFMT_16BIT)? 2 : 1; - } - } - } - - sndbuf_dmasetdir(sb->pch.buffer, PCMDIR_PLAY); - sndbuf_dmasetdir(sb->rch.buffer, PCMDIR_REC); - - /* - printf("setup: [pch = %d, pfmt = %d, pgo = %d] [rch = %d, rfmt = %d, rgo = %d]\n", - sb->pch.dch, sb->pch.fmt, sb->pch.run, sb->rch.dch, sb->rch.fmt, sb->rch.run); - */ - - ch = &sb->pch; - if (ch->run) { - l = ch->blksz; - if (ch->fmt & AFMT_16BIT) - l >>= 1; - l--; - - /* play speed */ - RANGE(ch->spd, 5000, 45000); - sb_cmd(sb, DSP_CMD_OUT16); - sb_cmd(sb, ch->spd >> 8); - sb_cmd(sb, ch->spd & 0xff); - - /* play format, length */ - v = DSP_F16_AUTO | DSP_F16_FIFO_ON | DSP_F16_DAC; - v |= (ch->fmt & AFMT_16BIT)? DSP_DMA16 : DSP_DMA8; - sb_cmd(sb, v); - - v = (AFMT_CHANNEL(ch->fmt) > 1)? DSP_F16_STEREO : 0; - v |= (ch->fmt & AFMT_SIGNED)? DSP_F16_SIGNED : 0; - sb_cmd2(sb, v, l); - sndbuf_dma(ch->buffer, PCMTRIG_START); - sb->bd_flags |= BD_F_DMARUN; - } - - ch = &sb->rch; - if (ch->run) { - l = ch->blksz; - if (ch->fmt & AFMT_16BIT) - l >>= 1; - l--; - - /* record speed */ - RANGE(ch->spd, 5000, 45000); - sb_cmd(sb, DSP_CMD_IN16); - sb_cmd(sb, ch->spd >> 8); - sb_cmd(sb, ch->spd & 0xff); - - /* record format, length */ - v = DSP_F16_AUTO | DSP_F16_FIFO_ON | DSP_F16_ADC; - v |= (ch->fmt & AFMT_16BIT)? DSP_DMA16 : DSP_DMA8; - sb_cmd(sb, v); - - v = (AFMT_CHANNEL(ch->fmt) > 1)? DSP_F16_STEREO : 0; - v |= (ch->fmt & AFMT_SIGNED)? DSP_F16_SIGNED : 0; - sb_cmd2(sb, v, l); - sndbuf_dma(ch->buffer, PCMTRIG_START); - sb->bd_flags |= BD_F_DMARUN2; - } - sb_unlock(sb); - - return 0; -} - -/* channel interface */ -static void * -sb16chan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel *c, int dir) -{ - struct sb_info *sb = devinfo; - struct sb_chinfo *ch = (dir == PCMDIR_PLAY)? &sb->pch : &sb->rch; - - ch->parent = sb; - ch->channel = c; - ch->buffer = b; - ch->dir = dir; - - if (sndbuf_alloc(ch->buffer, sb->parent_dmat, 0, sb->bufsize) != 0) - return NULL; - - return ch; -} - -static int -sb16chan_setformat(kobj_t obj, void *data, u_int32_t format) -{ - struct sb_chinfo *ch = data; - struct sb_info *sb = ch->parent; - - ch->fmt = format; - sb->prio = ch->dir; - sb->prio16 = (ch->fmt & AFMT_16BIT)? 1 : 0; - - return 0; -} - *** 1836 LINES SKIPPED ***