Linux Audio

Check our new training course

Loading...
v5.9
  1// SPDX-License-Identifier: GPL-2.0-or-later
  2/*
  3 *  Driver for Trident 4DWave DX/NX & SiS SI7018 Audio PCI soundcard
  4 *
  5 *  Driver was originated by Trident <audio@tridentmicro.com>
  6 *  			     Fri Feb 19 15:55:28 MST 1999
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  7 */
  8
  9#include <linux/init.h>
 10#include <linux/pci.h>
 11#include <linux/time.h>
 12#include <linux/module.h>
 13#include <sound/core.h>
 14#include "trident.h"
 15#include <sound/initval.h>
 16
 17MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>, <audio@tridentmicro.com>");
 18MODULE_DESCRIPTION("Trident 4D-WaveDX/NX & SiS SI7018");
 19MODULE_LICENSE("GPL");
 20MODULE_SUPPORTED_DEVICE("{{Trident,4DWave DX},"
 21		"{Trident,4DWave NX},"
 22		"{SiS,SI7018 PCI Audio},"
 23		"{Best Union,Miss Melody 4DWave PCI},"
 24		"{HIS,4DWave PCI},"
 25		"{Warpspeed,ONSpeed 4DWave PCI},"
 26		"{Aztech Systems,PCI 64-Q3D},"
 27		"{Addonics,SV 750},"
 28		"{CHIC,True Sound 4Dwave},"
 29		"{Shark,Predator4D-PCI},"
 30		"{Jaton,SonicWave 4D},"
 31		"{Hoontech,SoundTrack Digital 4DWave NX}}");
 32
 33static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;	/* Index 0-MAX */
 34static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;	/* ID for this card */
 35static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;	/* Enable this card */
 36static int pcm_channels[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 32};
 37static int wavetable_size[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 8192};
 38
 39module_param_array(index, int, NULL, 0444);
 40MODULE_PARM_DESC(index, "Index value for Trident 4DWave PCI soundcard.");
 41module_param_array(id, charp, NULL, 0444);
 42MODULE_PARM_DESC(id, "ID string for Trident 4DWave PCI soundcard.");
 43module_param_array(enable, bool, NULL, 0444);
 44MODULE_PARM_DESC(enable, "Enable Trident 4DWave PCI soundcard.");
 45module_param_array(pcm_channels, int, NULL, 0444);
 46MODULE_PARM_DESC(pcm_channels, "Number of hardware channels assigned for PCM.");
 47module_param_array(wavetable_size, int, NULL, 0444);
 48MODULE_PARM_DESC(wavetable_size, "Maximum memory size in kB for wavetable synth.");
 49
 50static const struct pci_device_id snd_trident_ids[] = {
 51	{PCI_DEVICE(PCI_VENDOR_ID_TRIDENT, PCI_DEVICE_ID_TRIDENT_4DWAVE_DX), 
 52		PCI_CLASS_MULTIMEDIA_AUDIO << 8, 0xffff00, 0},
 53	{PCI_DEVICE(PCI_VENDOR_ID_TRIDENT, PCI_DEVICE_ID_TRIDENT_4DWAVE_NX), 
 54		0, 0, 0},
 55	{PCI_DEVICE(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_7018), 0, 0, 0},
 56	{ 0, }
 57};
 58
 59MODULE_DEVICE_TABLE(pci, snd_trident_ids);
 60
 61static int snd_trident_probe(struct pci_dev *pci,
 62			     const struct pci_device_id *pci_id)
 63{
 64	static int dev;
 65	struct snd_card *card;
 66	struct snd_trident *trident;
 67	const char *str;
 68	int err, pcm_dev = 0;
 69
 70	if (dev >= SNDRV_CARDS)
 71		return -ENODEV;
 72	if (!enable[dev]) {
 73		dev++;
 74		return -ENOENT;
 75	}
 76
 77	err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,
 78			   0, &card);
 79	if (err < 0)
 80		return err;
 81
 82	if ((err = snd_trident_create(card, pci,
 83				      pcm_channels[dev],
 84				      ((pci->vendor << 16) | pci->device) == TRIDENT_DEVICE_ID_SI7018 ? 1 : 2,
 85				      wavetable_size[dev],
 86				      &trident)) < 0) {
 87		snd_card_free(card);
 88		return err;
 89	}
 90	card->private_data = trident;
 91
 92	switch (trident->device) {
 93	case TRIDENT_DEVICE_ID_DX:
 94		str = "TRID4DWAVEDX";
 95		break;
 96	case TRIDENT_DEVICE_ID_NX:
 97		str = "TRID4DWAVENX";
 98		break;
 99	case TRIDENT_DEVICE_ID_SI7018:
100		str = "SI7018";
101		break;
102	default:
103		str = "Unknown";
104	}
105	strcpy(card->driver, str);
106	if (trident->device == TRIDENT_DEVICE_ID_SI7018) {
107		strcpy(card->shortname, "SiS ");
108	} else {
109		strcpy(card->shortname, "Trident ");
110	}
111	strcat(card->shortname, str);
112	sprintf(card->longname, "%s PCI Audio at 0x%lx, irq %d",
113		card->shortname, trident->port, trident->irq);
114
115	if ((err = snd_trident_pcm(trident, pcm_dev++)) < 0) {
116		snd_card_free(card);
117		return err;
118	}
119	switch (trident->device) {
120	case TRIDENT_DEVICE_ID_DX:
121	case TRIDENT_DEVICE_ID_NX:
122		if ((err = snd_trident_foldback_pcm(trident, pcm_dev++)) < 0) {
123			snd_card_free(card);
124			return err;
125		}
126		break;
127	}
128	if (trident->device == TRIDENT_DEVICE_ID_NX || trident->device == TRIDENT_DEVICE_ID_SI7018) {
129		if ((err = snd_trident_spdif_pcm(trident, pcm_dev++)) < 0) {
130			snd_card_free(card);
131			return err;
132		}
133	}
134	if (trident->device != TRIDENT_DEVICE_ID_SI7018 &&
135	    (err = snd_mpu401_uart_new(card, 0, MPU401_HW_TRID4DWAVE,
136				       trident->midi_port,
137				       MPU401_INFO_INTEGRATED |
138				       MPU401_INFO_IRQ_HOOK,
139				       -1, &trident->rmidi)) < 0) {
140		snd_card_free(card);
141		return err;
142	}
143
144	snd_trident_create_gameport(trident);
145
146	if ((err = snd_card_register(card)) < 0) {
147		snd_card_free(card);
148		return err;
149	}
150	pci_set_drvdata(pci, card);
151	dev++;
152	return 0;
153}
154
155static void snd_trident_remove(struct pci_dev *pci)
156{
157	snd_card_free(pci_get_drvdata(pci));
158}
159
160static struct pci_driver trident_driver = {
161	.name = KBUILD_MODNAME,
162	.id_table = snd_trident_ids,
163	.probe = snd_trident_probe,
164	.remove = snd_trident_remove,
165#ifdef CONFIG_PM_SLEEP
166	.driver = {
167		.pm = &snd_trident_pm,
168	},
169#endif
170};
171
172module_pci_driver(trident_driver);
v4.17
 
  1/*
  2 *  Driver for Trident 4DWave DX/NX & SiS SI7018 Audio PCI soundcard
  3 *
  4 *  Driver was originated by Trident <audio@tridentmicro.com>
  5 *  			     Fri Feb 19 15:55:28 MST 1999
  6 *
  7 *
  8 *   This program is free software; you can redistribute it and/or modify
  9 *   it under the terms of the GNU General Public License as published by
 10 *   the Free Software Foundation; either version 2 of the License, or
 11 *   (at your option) any later version.
 12 *
 13 *   This program is distributed in the hope that it will be useful,
 14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 16 *   GNU General Public License for more details.
 17 *
 18 *   You should have received a copy of the GNU General Public License
 19 *   along with this program; if not, write to the Free Software
 20 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 21 *
 22 */
 23
 24#include <linux/init.h>
 25#include <linux/pci.h>
 26#include <linux/time.h>
 27#include <linux/module.h>
 28#include <sound/core.h>
 29#include "trident.h"
 30#include <sound/initval.h>
 31
 32MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>, <audio@tridentmicro.com>");
 33MODULE_DESCRIPTION("Trident 4D-WaveDX/NX & SiS SI7018");
 34MODULE_LICENSE("GPL");
 35MODULE_SUPPORTED_DEVICE("{{Trident,4DWave DX},"
 36		"{Trident,4DWave NX},"
 37		"{SiS,SI7018 PCI Audio},"
 38		"{Best Union,Miss Melody 4DWave PCI},"
 39		"{HIS,4DWave PCI},"
 40		"{Warpspeed,ONSpeed 4DWave PCI},"
 41		"{Aztech Systems,PCI 64-Q3D},"
 42		"{Addonics,SV 750},"
 43		"{CHIC,True Sound 4Dwave},"
 44		"{Shark,Predator4D-PCI},"
 45		"{Jaton,SonicWave 4D},"
 46		"{Hoontech,SoundTrack Digital 4DWave NX}}");
 47
 48static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;	/* Index 0-MAX */
 49static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;	/* ID for this card */
 50static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;	/* Enable this card */
 51static int pcm_channels[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 32};
 52static int wavetable_size[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 8192};
 53
 54module_param_array(index, int, NULL, 0444);
 55MODULE_PARM_DESC(index, "Index value for Trident 4DWave PCI soundcard.");
 56module_param_array(id, charp, NULL, 0444);
 57MODULE_PARM_DESC(id, "ID string for Trident 4DWave PCI soundcard.");
 58module_param_array(enable, bool, NULL, 0444);
 59MODULE_PARM_DESC(enable, "Enable Trident 4DWave PCI soundcard.");
 60module_param_array(pcm_channels, int, NULL, 0444);
 61MODULE_PARM_DESC(pcm_channels, "Number of hardware channels assigned for PCM.");
 62module_param_array(wavetable_size, int, NULL, 0444);
 63MODULE_PARM_DESC(wavetable_size, "Maximum memory size in kB for wavetable synth.");
 64
 65static const struct pci_device_id snd_trident_ids[] = {
 66	{PCI_DEVICE(PCI_VENDOR_ID_TRIDENT, PCI_DEVICE_ID_TRIDENT_4DWAVE_DX), 
 67		PCI_CLASS_MULTIMEDIA_AUDIO << 8, 0xffff00, 0},
 68	{PCI_DEVICE(PCI_VENDOR_ID_TRIDENT, PCI_DEVICE_ID_TRIDENT_4DWAVE_NX), 
 69		0, 0, 0},
 70	{PCI_DEVICE(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_7018), 0, 0, 0},
 71	{ 0, }
 72};
 73
 74MODULE_DEVICE_TABLE(pci, snd_trident_ids);
 75
 76static int snd_trident_probe(struct pci_dev *pci,
 77			     const struct pci_device_id *pci_id)
 78{
 79	static int dev;
 80	struct snd_card *card;
 81	struct snd_trident *trident;
 82	const char *str;
 83	int err, pcm_dev = 0;
 84
 85	if (dev >= SNDRV_CARDS)
 86		return -ENODEV;
 87	if (!enable[dev]) {
 88		dev++;
 89		return -ENOENT;
 90	}
 91
 92	err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,
 93			   0, &card);
 94	if (err < 0)
 95		return err;
 96
 97	if ((err = snd_trident_create(card, pci,
 98				      pcm_channels[dev],
 99				      ((pci->vendor << 16) | pci->device) == TRIDENT_DEVICE_ID_SI7018 ? 1 : 2,
100				      wavetable_size[dev],
101				      &trident)) < 0) {
102		snd_card_free(card);
103		return err;
104	}
105	card->private_data = trident;
106
107	switch (trident->device) {
108	case TRIDENT_DEVICE_ID_DX:
109		str = "TRID4DWAVEDX";
110		break;
111	case TRIDENT_DEVICE_ID_NX:
112		str = "TRID4DWAVENX";
113		break;
114	case TRIDENT_DEVICE_ID_SI7018:
115		str = "SI7018";
116		break;
117	default:
118		str = "Unknown";
119	}
120	strcpy(card->driver, str);
121	if (trident->device == TRIDENT_DEVICE_ID_SI7018) {
122		strcpy(card->shortname, "SiS ");
123	} else {
124		strcpy(card->shortname, "Trident ");
125	}
126	strcat(card->shortname, card->driver);
127	sprintf(card->longname, "%s PCI Audio at 0x%lx, irq %d",
128		card->shortname, trident->port, trident->irq);
129
130	if ((err = snd_trident_pcm(trident, pcm_dev++)) < 0) {
131		snd_card_free(card);
132		return err;
133	}
134	switch (trident->device) {
135	case TRIDENT_DEVICE_ID_DX:
136	case TRIDENT_DEVICE_ID_NX:
137		if ((err = snd_trident_foldback_pcm(trident, pcm_dev++)) < 0) {
138			snd_card_free(card);
139			return err;
140		}
141		break;
142	}
143	if (trident->device == TRIDENT_DEVICE_ID_NX || trident->device == TRIDENT_DEVICE_ID_SI7018) {
144		if ((err = snd_trident_spdif_pcm(trident, pcm_dev++)) < 0) {
145			snd_card_free(card);
146			return err;
147		}
148	}
149	if (trident->device != TRIDENT_DEVICE_ID_SI7018 &&
150	    (err = snd_mpu401_uart_new(card, 0, MPU401_HW_TRID4DWAVE,
151				       trident->midi_port,
152				       MPU401_INFO_INTEGRATED |
153				       MPU401_INFO_IRQ_HOOK,
154				       -1, &trident->rmidi)) < 0) {
155		snd_card_free(card);
156		return err;
157	}
158
159	snd_trident_create_gameport(trident);
160
161	if ((err = snd_card_register(card)) < 0) {
162		snd_card_free(card);
163		return err;
164	}
165	pci_set_drvdata(pci, card);
166	dev++;
167	return 0;
168}
169
170static void snd_trident_remove(struct pci_dev *pci)
171{
172	snd_card_free(pci_get_drvdata(pci));
173}
174
175static struct pci_driver trident_driver = {
176	.name = KBUILD_MODNAME,
177	.id_table = snd_trident_ids,
178	.probe = snd_trident_probe,
179	.remove = snd_trident_remove,
180#ifdef CONFIG_PM_SLEEP
181	.driver = {
182		.pm = &snd_trident_pm,
183	},
184#endif
185};
186
187module_pci_driver(trident_driver);