cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

adlib.c (2416B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * AdLib FM card driver.
      4 */
      5
      6#include <linux/kernel.h>
      7#include <linux/module.h>
      8#include <linux/isa.h>
      9#include <sound/core.h>
     10#include <sound/initval.h>
     11#include <sound/opl3.h>
     12
     13#define CRD_NAME "AdLib FM"
     14#define DEV_NAME "adlib"
     15
     16MODULE_DESCRIPTION(CRD_NAME);
     17MODULE_AUTHOR("Rene Herman");
     18MODULE_LICENSE("GPL");
     19
     20static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
     21static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
     22static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE;
     23static long port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
     24
     25module_param_array(index, int, NULL, 0444);
     26MODULE_PARM_DESC(index, "Index value for " CRD_NAME " soundcard.");
     27module_param_array(id, charp, NULL, 0444);
     28MODULE_PARM_DESC(id, "ID string for " CRD_NAME " soundcard.");
     29module_param_array(enable, bool, NULL, 0444);
     30MODULE_PARM_DESC(enable, "Enable " CRD_NAME " soundcard.");
     31module_param_hw_array(port, long, ioport, NULL, 0444);
     32MODULE_PARM_DESC(port, "Port # for " CRD_NAME " driver.");
     33
     34static int snd_adlib_match(struct device *dev, unsigned int n)
     35{
     36	if (!enable[n])
     37		return 0;
     38
     39	if (port[n] == SNDRV_AUTO_PORT) {
     40		dev_err(dev, "please specify port\n");
     41		return 0;
     42	}
     43	return 1;
     44}
     45
     46static int snd_adlib_probe(struct device *dev, unsigned int n)
     47{
     48	struct snd_card *card;
     49	struct snd_opl3 *opl3;
     50	int error;
     51
     52	error = snd_devm_card_new(dev, index[n], id[n], THIS_MODULE, 0, &card);
     53	if (error < 0) {
     54		dev_err(dev, "could not create card\n");
     55		return error;
     56	}
     57
     58	card->private_data = devm_request_region(dev, port[n], 4, CRD_NAME);
     59	if (!card->private_data) {
     60		dev_err(dev, "could not grab ports\n");
     61		return -EBUSY;
     62	}
     63
     64	strcpy(card->driver, DEV_NAME);
     65	strcpy(card->shortname, CRD_NAME);
     66	sprintf(card->longname, CRD_NAME " at %#lx", port[n]);
     67
     68	error = snd_opl3_create(card, port[n], port[n] + 2, OPL3_HW_AUTO, 1, &opl3);
     69	if (error < 0) {
     70		dev_err(dev, "could not create OPL\n");
     71		return error;
     72	}
     73
     74	error = snd_opl3_hwdep_new(opl3, 0, 0, NULL);
     75	if (error < 0) {
     76		dev_err(dev, "could not create FM\n");
     77		return error;
     78	}
     79
     80	error = snd_card_register(card);
     81	if (error < 0) {
     82		dev_err(dev, "could not register card\n");
     83		return error;
     84	}
     85
     86	dev_set_drvdata(dev, card);
     87	return 0;
     88}
     89
     90static struct isa_driver snd_adlib_driver = {
     91	.match		= snd_adlib_match,
     92	.probe		= snd_adlib_probe,
     93
     94	.driver		= {
     95		.name	= DEV_NAME
     96	}
     97};
     98
     99module_isa_driver(snd_adlib_driver, SNDRV_CARDS);