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

sscape.c (31608B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 *   Low-level ALSA driver for the ENSONIQ SoundScape
      4 *   Copyright (c) by Chris Rankin
      5 *
      6 *   This driver was written in part using information obtained from
      7 *   the OSS/Free SoundScape driver, written by Hannu Savolainen.
      8 */
      9
     10#include <linux/init.h>
     11#include <linux/err.h>
     12#include <linux/io.h>
     13#include <linux/isa.h>
     14#include <linux/delay.h>
     15#include <linux/firmware.h>
     16#include <linux/pnp.h>
     17#include <linux/spinlock.h>
     18#include <linux/module.h>
     19#include <asm/dma.h>
     20#include <sound/core.h>
     21#include <sound/wss.h>
     22#include <sound/mpu401.h>
     23#include <sound/initval.h>
     24
     25
     26MODULE_AUTHOR("Chris Rankin");
     27MODULE_DESCRIPTION("ENSONIQ SoundScape driver");
     28MODULE_LICENSE("GPL");
     29MODULE_FIRMWARE("sndscape.co0");
     30MODULE_FIRMWARE("sndscape.co1");
     31MODULE_FIRMWARE("sndscape.co2");
     32MODULE_FIRMWARE("sndscape.co3");
     33MODULE_FIRMWARE("sndscape.co4");
     34MODULE_FIRMWARE("scope.cod");
     35
     36static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
     37static char* id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
     38static long port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
     39static long wss_port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
     40static int irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ;
     41static int mpu_irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ;
     42static int dma[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;
     43static int dma2[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;
     44static bool joystick[SNDRV_CARDS];
     45
     46module_param_array(index, int, NULL, 0444);
     47MODULE_PARM_DESC(index, "Index number for SoundScape soundcard");
     48
     49module_param_array(id, charp, NULL, 0444);
     50MODULE_PARM_DESC(id, "Description for SoundScape card");
     51
     52module_param_hw_array(port, long, ioport, NULL, 0444);
     53MODULE_PARM_DESC(port, "Port # for SoundScape driver.");
     54
     55module_param_hw_array(wss_port, long, ioport, NULL, 0444);
     56MODULE_PARM_DESC(wss_port, "WSS Port # for SoundScape driver.");
     57
     58module_param_hw_array(irq, int, irq, NULL, 0444);
     59MODULE_PARM_DESC(irq, "IRQ # for SoundScape driver.");
     60
     61module_param_hw_array(mpu_irq, int, irq, NULL, 0444);
     62MODULE_PARM_DESC(mpu_irq, "MPU401 IRQ # for SoundScape driver.");
     63
     64module_param_hw_array(dma, int, dma, NULL, 0444);
     65MODULE_PARM_DESC(dma, "DMA # for SoundScape driver.");
     66
     67module_param_hw_array(dma2, int, dma, NULL, 0444);
     68MODULE_PARM_DESC(dma2, "DMA2 # for SoundScape driver.");
     69
     70module_param_array(joystick, bool, NULL, 0444);
     71MODULE_PARM_DESC(joystick, "Enable gameport.");
     72
     73#ifdef CONFIG_PNP
     74static int isa_registered;
     75static int pnp_registered;
     76
     77static const struct pnp_card_device_id sscape_pnpids[] = {
     78	{ .id = "ENS3081", .devs = { { "ENS0000" } } }, /* Soundscape PnP */
     79	{ .id = "ENS4081", .devs = { { "ENS1011" } } },	/* VIVO90 */
     80	{ .id = "" }	/* end */
     81};
     82
     83MODULE_DEVICE_TABLE(pnp_card, sscape_pnpids);
     84#endif
     85
     86
     87#define HOST_CTRL_IO(i)  ((i) + 2)
     88#define HOST_DATA_IO(i)  ((i) + 3)
     89#define ODIE_ADDR_IO(i)  ((i) + 4)
     90#define ODIE_DATA_IO(i)  ((i) + 5)
     91#define CODEC_IO(i)      ((i) + 8)
     92
     93#define IC_ODIE  1
     94#define IC_OPUS  2
     95
     96#define RX_READY 0x01
     97#define TX_READY 0x02
     98
     99#define CMD_ACK			0x80
    100#define CMD_SET_MIDI_VOL	0x84
    101#define CMD_GET_MIDI_VOL	0x85
    102#define CMD_XXX_MIDI_VOL	0x86
    103#define CMD_SET_EXTMIDI		0x8a
    104#define CMD_GET_EXTMIDI		0x8b
    105#define CMD_SET_MT32		0x8c
    106#define CMD_GET_MT32		0x8d
    107
    108enum GA_REG {
    109	GA_INTSTAT_REG = 0,
    110	GA_INTENA_REG,
    111	GA_DMAA_REG,
    112	GA_DMAB_REG,
    113	GA_INTCFG_REG,
    114	GA_DMACFG_REG,
    115	GA_CDCFG_REG,
    116	GA_SMCFGA_REG,
    117	GA_SMCFGB_REG,
    118	GA_HMCTL_REG
    119};
    120
    121#define DMA_8BIT  0x80
    122
    123
    124enum card_type {
    125	MEDIA_FX,	/* Sequoia S-1000 */
    126	SSCAPE,		/* Sequoia S-2000 */
    127	SSCAPE_PNP,
    128	SSCAPE_VIVO,
    129};
    130
    131struct soundscape {
    132	spinlock_t lock;
    133	unsigned io_base;
    134	int ic_type;
    135	enum card_type type;
    136	struct resource *io_res;
    137	struct resource *wss_res;
    138	struct snd_wss *chip;
    139
    140	unsigned char midi_vol;
    141};
    142
    143#define INVALID_IRQ  ((unsigned)-1)
    144
    145
    146static inline struct soundscape *get_card_soundscape(struct snd_card *c)
    147{
    148	return (struct soundscape *) (c->private_data);
    149}
    150
    151/*
    152 * Allocates some kernel memory that we can use for DMA.
    153 * I think this means that the memory has to map to
    154 * contiguous pages of physical memory.
    155 */
    156static struct snd_dma_buffer *get_dmabuf(struct soundscape *s,
    157					 struct snd_dma_buffer *buf,
    158					 unsigned long size)
    159{
    160	if (buf) {
    161		if (snd_dma_alloc_pages_fallback(SNDRV_DMA_TYPE_DEV,
    162						 s->chip->card->dev,
    163						 size, buf) < 0) {
    164			snd_printk(KERN_ERR "sscape: Failed to allocate "
    165					    "%lu bytes for DMA\n",
    166					    size);
    167			return NULL;
    168		}
    169	}
    170
    171	return buf;
    172}
    173
    174/*
    175 * Release the DMA-able kernel memory ...
    176 */
    177static void free_dmabuf(struct snd_dma_buffer *buf)
    178{
    179	if (buf && buf->area)
    180		snd_dma_free_pages(buf);
    181}
    182
    183/*
    184 * This function writes to the SoundScape's control registers,
    185 * but doesn't do any locking. It's up to the caller to do that.
    186 * This is why this function is "unsafe" ...
    187 */
    188static inline void sscape_write_unsafe(unsigned io_base, enum GA_REG reg,
    189				       unsigned char val)
    190{
    191	outb(reg, ODIE_ADDR_IO(io_base));
    192	outb(val, ODIE_DATA_IO(io_base));
    193}
    194
    195/*
    196 * Write to the SoundScape's control registers, and do the
    197 * necessary locking ...
    198 */
    199static void sscape_write(struct soundscape *s, enum GA_REG reg,
    200			 unsigned char val)
    201{
    202	unsigned long flags;
    203
    204	spin_lock_irqsave(&s->lock, flags);
    205	sscape_write_unsafe(s->io_base, reg, val);
    206	spin_unlock_irqrestore(&s->lock, flags);
    207}
    208
    209/*
    210 * Read from the SoundScape's control registers, but leave any
    211 * locking to the caller. This is why the function is "unsafe" ...
    212 */
    213static inline unsigned char sscape_read_unsafe(unsigned io_base,
    214					       enum GA_REG reg)
    215{
    216	outb(reg, ODIE_ADDR_IO(io_base));
    217	return inb(ODIE_DATA_IO(io_base));
    218}
    219
    220/*
    221 * Puts the SoundScape into "host" mode, as compared to "MIDI" mode
    222 */
    223static inline void set_host_mode_unsafe(unsigned io_base)
    224{
    225	outb(0x0, HOST_CTRL_IO(io_base));
    226}
    227
    228/*
    229 * Puts the SoundScape into "MIDI" mode, as compared to "host" mode
    230 */
    231static inline void set_midi_mode_unsafe(unsigned io_base)
    232{
    233	outb(0x3, HOST_CTRL_IO(io_base));
    234}
    235
    236/*
    237 * Read the SoundScape's host-mode control register, but leave
    238 * any locking issues to the caller ...
    239 */
    240static inline int host_read_unsafe(unsigned io_base)
    241{
    242	int data = -1;
    243	if ((inb(HOST_CTRL_IO(io_base)) & RX_READY) != 0)
    244		data = inb(HOST_DATA_IO(io_base));
    245
    246	return data;
    247}
    248
    249/*
    250 * Read the SoundScape's host-mode control register, performing
    251 * a limited amount of busy-waiting if the register isn't ready.
    252 * Also leaves all locking-issues to the caller ...
    253 */
    254static int host_read_ctrl_unsafe(unsigned io_base, unsigned timeout)
    255{
    256	int data;
    257
    258	while (((data = host_read_unsafe(io_base)) < 0) && (timeout != 0)) {
    259		udelay(100);
    260		--timeout;
    261	} /* while */
    262
    263	return data;
    264}
    265
    266/*
    267 * Write to the SoundScape's host-mode control registers, but
    268 * leave any locking issues to the caller ...
    269 */
    270static inline int host_write_unsafe(unsigned io_base, unsigned char data)
    271{
    272	if ((inb(HOST_CTRL_IO(io_base)) & TX_READY) != 0) {
    273		outb(data, HOST_DATA_IO(io_base));
    274		return 1;
    275	}
    276
    277	return 0;
    278}
    279
    280/*
    281 * Write to the SoundScape's host-mode control registers, performing
    282 * a limited amount of busy-waiting if the register isn't ready.
    283 * Also leaves all locking-issues to the caller ...
    284 */
    285static int host_write_ctrl_unsafe(unsigned io_base, unsigned char data,
    286				  unsigned timeout)
    287{
    288	int err;
    289
    290	while (!(err = host_write_unsafe(io_base, data)) && (timeout != 0)) {
    291		udelay(100);
    292		--timeout;
    293	} /* while */
    294
    295	return err;
    296}
    297
    298
    299/*
    300 * Check that the MIDI subsystem is operational. If it isn't,
    301 * then we will hang the computer if we try to use it ...
    302 *
    303 * NOTE: This check is based upon observation, not documentation.
    304 */
    305static inline int verify_mpu401(const struct snd_mpu401 *mpu)
    306{
    307	return ((inb(MPU401C(mpu)) & 0xc0) == 0x80);
    308}
    309
    310/*
    311 * This is apparently the standard way to initialise an MPU-401
    312 */
    313static inline void initialise_mpu401(const struct snd_mpu401 *mpu)
    314{
    315	outb(0, MPU401D(mpu));
    316}
    317
    318/*
    319 * Tell the SoundScape to activate the AD1845 chip (I think).
    320 * The AD1845 detection fails if we *don't* do this, so I
    321 * think that this is a good idea ...
    322 */
    323static void activate_ad1845_unsafe(unsigned io_base)
    324{
    325	unsigned char val = sscape_read_unsafe(io_base, GA_HMCTL_REG);
    326	sscape_write_unsafe(io_base, GA_HMCTL_REG, (val & 0xcf) | 0x10);
    327	sscape_write_unsafe(io_base, GA_CDCFG_REG, 0x80);
    328}
    329
    330/*
    331 * Tell the SoundScape to begin a DMA transfer using the given channel.
    332 * All locking issues are left to the caller.
    333 */
    334static void sscape_start_dma_unsafe(unsigned io_base, enum GA_REG reg)
    335{
    336	sscape_write_unsafe(io_base, reg,
    337			    sscape_read_unsafe(io_base, reg) | 0x01);
    338	sscape_write_unsafe(io_base, reg,
    339			    sscape_read_unsafe(io_base, reg) & 0xfe);
    340}
    341
    342/*
    343 * Wait for a DMA transfer to complete. This is a "limited busy-wait",
    344 * and all locking issues are left to the caller.
    345 */
    346static int sscape_wait_dma_unsafe(unsigned io_base, enum GA_REG reg,
    347				  unsigned timeout)
    348{
    349	while (!(sscape_read_unsafe(io_base, reg) & 0x01) && (timeout != 0)) {
    350		udelay(100);
    351		--timeout;
    352	} /* while */
    353
    354	return sscape_read_unsafe(io_base, reg) & 0x01;
    355}
    356
    357/*
    358 * Wait for the On-Board Processor to return its start-up
    359 * acknowledgement sequence. This wait is too long for
    360 * us to perform "busy-waiting", and so we must sleep.
    361 * This in turn means that we must not be holding any
    362 * spinlocks when we call this function.
    363 */
    364static int obp_startup_ack(struct soundscape *s, unsigned timeout)
    365{
    366	unsigned long end_time = jiffies + msecs_to_jiffies(timeout);
    367
    368	do {
    369		unsigned long flags;
    370		int x;
    371
    372		spin_lock_irqsave(&s->lock, flags);
    373		x = host_read_unsafe(s->io_base);
    374		spin_unlock_irqrestore(&s->lock, flags);
    375		if (x == 0xfe || x == 0xff)
    376			return 1;
    377
    378		msleep(10);
    379	} while (time_before(jiffies, end_time));
    380
    381	return 0;
    382}
    383
    384/*
    385 * Wait for the host to return its start-up acknowledgement
    386 * sequence. This wait is too long for us to perform
    387 * "busy-waiting", and so we must sleep. This in turn means
    388 * that we must not be holding any spinlocks when we call
    389 * this function.
    390 */
    391static int host_startup_ack(struct soundscape *s, unsigned timeout)
    392{
    393	unsigned long end_time = jiffies + msecs_to_jiffies(timeout);
    394
    395	do {
    396		unsigned long flags;
    397		int x;
    398
    399		spin_lock_irqsave(&s->lock, flags);
    400		x = host_read_unsafe(s->io_base);
    401		spin_unlock_irqrestore(&s->lock, flags);
    402		if (x == 0xfe)
    403			return 1;
    404
    405		msleep(10);
    406	} while (time_before(jiffies, end_time));
    407
    408	return 0;
    409}
    410
    411/*
    412 * Upload a byte-stream into the SoundScape using DMA channel A.
    413 */
    414static int upload_dma_data(struct soundscape *s, const unsigned char *data,
    415			   size_t size)
    416{
    417	unsigned long flags;
    418	struct snd_dma_buffer dma;
    419	int ret;
    420	unsigned char val;
    421
    422	if (!get_dmabuf(s, &dma, PAGE_ALIGN(32 * 1024)))
    423		return -ENOMEM;
    424
    425	spin_lock_irqsave(&s->lock, flags);
    426
    427	/*
    428	 * Reset the board ...
    429	 */
    430	val = sscape_read_unsafe(s->io_base, GA_HMCTL_REG);
    431	sscape_write_unsafe(s->io_base, GA_HMCTL_REG, val & 0x3f);
    432
    433	/*
    434	 * Enable the DMA channels and configure them ...
    435	 */
    436	val = (s->chip->dma1 << 4) | DMA_8BIT;
    437	sscape_write_unsafe(s->io_base, GA_DMAA_REG, val);
    438	sscape_write_unsafe(s->io_base, GA_DMAB_REG, 0x20);
    439
    440	/*
    441	 * Take the board out of reset ...
    442	 */
    443	val = sscape_read_unsafe(s->io_base, GA_HMCTL_REG);
    444	sscape_write_unsafe(s->io_base, GA_HMCTL_REG, val | 0x80);
    445
    446	/*
    447	 * Upload the firmware to the SoundScape
    448	 * board through the DMA channel ...
    449	 */
    450	while (size != 0) {
    451		unsigned long len;
    452
    453		len = min(size, dma.bytes);
    454		memcpy(dma.area, data, len);
    455		data += len;
    456		size -= len;
    457
    458		snd_dma_program(s->chip->dma1, dma.addr, len, DMA_MODE_WRITE);
    459		sscape_start_dma_unsafe(s->io_base, GA_DMAA_REG);
    460		if (!sscape_wait_dma_unsafe(s->io_base, GA_DMAA_REG, 5000)) {
    461			/*
    462			 * Don't forget to release this spinlock we're holding
    463			 */
    464			spin_unlock_irqrestore(&s->lock, flags);
    465
    466			snd_printk(KERN_ERR
    467					"sscape: DMA upload has timed out\n");
    468			ret = -EAGAIN;
    469			goto _release_dma;
    470		}
    471	} /* while */
    472
    473	set_host_mode_unsafe(s->io_base);
    474	outb(0x0, s->io_base);
    475
    476	/*
    477	 * Boot the board ... (I think)
    478	 */
    479	val = sscape_read_unsafe(s->io_base, GA_HMCTL_REG);
    480	sscape_write_unsafe(s->io_base, GA_HMCTL_REG, val | 0x40);
    481	spin_unlock_irqrestore(&s->lock, flags);
    482
    483	/*
    484	 * If all has gone well, then the board should acknowledge
    485	 * the new upload and tell us that it has rebooted OK. We
    486	 * give it 5 seconds (max) ...
    487	 */
    488	ret = 0;
    489	if (!obp_startup_ack(s, 5000)) {
    490		snd_printk(KERN_ERR "sscape: No response "
    491				    "from on-board processor after upload\n");
    492		ret = -EAGAIN;
    493	} else if (!host_startup_ack(s, 5000)) {
    494		snd_printk(KERN_ERR
    495				"sscape: SoundScape failed to initialise\n");
    496		ret = -EAGAIN;
    497	}
    498
    499_release_dma:
    500	/*
    501	 * NOTE!!! We are NOT holding any spinlocks at this point !!!
    502	 */
    503	sscape_write(s, GA_DMAA_REG, (s->ic_type == IC_OPUS ? 0x40 : 0x70));
    504	free_dmabuf(&dma);
    505
    506	return ret;
    507}
    508
    509/*
    510 * Upload the bootblock(?) into the SoundScape. The only
    511 * purpose of this block of code seems to be to tell
    512 * us which version of the microcode we should be using.
    513 */
    514static int sscape_upload_bootblock(struct snd_card *card)
    515{
    516	struct soundscape *sscape = get_card_soundscape(card);
    517	unsigned long flags;
    518	const struct firmware *init_fw = NULL;
    519	int data = 0;
    520	int ret;
    521
    522	ret = request_firmware(&init_fw, "scope.cod", card->dev);
    523	if (ret < 0) {
    524		snd_printk(KERN_ERR "sscape: Error loading scope.cod");
    525		return ret;
    526	}
    527	ret = upload_dma_data(sscape, init_fw->data, init_fw->size);
    528
    529	release_firmware(init_fw);
    530
    531	spin_lock_irqsave(&sscape->lock, flags);
    532	if (ret == 0)
    533		data = host_read_ctrl_unsafe(sscape->io_base, 100);
    534
    535	if (data & 0x10)
    536		sscape_write_unsafe(sscape->io_base, GA_SMCFGA_REG, 0x2f);
    537
    538	spin_unlock_irqrestore(&sscape->lock, flags);
    539
    540	data &= 0xf;
    541	if (ret == 0 && data > 7) {
    542		snd_printk(KERN_ERR
    543				"sscape: timeout reading firmware version\n");
    544		ret = -EAGAIN;
    545	}
    546
    547	return (ret == 0) ? data : ret;
    548}
    549
    550/*
    551 * Upload the microcode into the SoundScape.
    552 */
    553static int sscape_upload_microcode(struct snd_card *card, int version)
    554{
    555	struct soundscape *sscape = get_card_soundscape(card);
    556	const struct firmware *init_fw = NULL;
    557	char name[14];
    558	int err;
    559
    560	snprintf(name, sizeof(name), "sndscape.co%d", version);
    561
    562	err = request_firmware(&init_fw, name, card->dev);
    563	if (err < 0) {
    564		snd_printk(KERN_ERR "sscape: Error loading sndscape.co%d",
    565				version);
    566		return err;
    567	}
    568	err = upload_dma_data(sscape, init_fw->data, init_fw->size);
    569	if (err == 0)
    570		snd_printk(KERN_INFO "sscape: MIDI firmware loaded %zu KBs\n",
    571				init_fw->size >> 10);
    572
    573	release_firmware(init_fw);
    574
    575	return err;
    576}
    577
    578/*
    579 * Mixer control for the SoundScape's MIDI device.
    580 */
    581static int sscape_midi_info(struct snd_kcontrol *ctl,
    582			    struct snd_ctl_elem_info *uinfo)
    583{
    584	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
    585	uinfo->count = 1;
    586	uinfo->value.integer.min = 0;
    587	uinfo->value.integer.max = 127;
    588	return 0;
    589}
    590
    591static int sscape_midi_get(struct snd_kcontrol *kctl,
    592			   struct snd_ctl_elem_value *uctl)
    593{
    594	struct snd_wss *chip = snd_kcontrol_chip(kctl);
    595	struct snd_card *card = chip->card;
    596	register struct soundscape *s = get_card_soundscape(card);
    597	unsigned long flags;
    598
    599	spin_lock_irqsave(&s->lock, flags);
    600	uctl->value.integer.value[0] = s->midi_vol;
    601	spin_unlock_irqrestore(&s->lock, flags);
    602	return 0;
    603}
    604
    605static int sscape_midi_put(struct snd_kcontrol *kctl,
    606			   struct snd_ctl_elem_value *uctl)
    607{
    608	struct snd_wss *chip = snd_kcontrol_chip(kctl);
    609	struct snd_card *card = chip->card;
    610	struct soundscape *s = get_card_soundscape(card);
    611	unsigned long flags;
    612	int change;
    613	unsigned char new_val;
    614
    615	spin_lock_irqsave(&s->lock, flags);
    616
    617	new_val = uctl->value.integer.value[0] & 127;
    618	/*
    619	 * We need to put the board into HOST mode before we
    620	 * can send any volume-changing HOST commands ...
    621	 */
    622	set_host_mode_unsafe(s->io_base);
    623
    624	/*
    625	 * To successfully change the MIDI volume setting, you seem to
    626	 * have to write a volume command, write the new volume value,
    627	 * and then perform another volume-related command. Perhaps the
    628	 * first command is an "open" and the second command is a "close"?
    629	 */
    630	if (s->midi_vol == new_val) {
    631		change = 0;
    632		goto __skip_change;
    633	}
    634	change = host_write_ctrl_unsafe(s->io_base, CMD_SET_MIDI_VOL, 100)
    635		 && host_write_ctrl_unsafe(s->io_base, new_val, 100)
    636		 && host_write_ctrl_unsafe(s->io_base, CMD_XXX_MIDI_VOL, 100)
    637		 && host_write_ctrl_unsafe(s->io_base, new_val, 100);
    638	s->midi_vol = new_val;
    639__skip_change:
    640
    641	/*
    642	 * Take the board out of HOST mode and back into MIDI mode ...
    643	 */
    644	set_midi_mode_unsafe(s->io_base);
    645
    646	spin_unlock_irqrestore(&s->lock, flags);
    647	return change;
    648}
    649
    650static const struct snd_kcontrol_new midi_mixer_ctl = {
    651	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
    652	.name = "MIDI",
    653	.info = sscape_midi_info,
    654	.get = sscape_midi_get,
    655	.put = sscape_midi_put
    656};
    657
    658/*
    659 * The SoundScape can use two IRQs from a possible set of four.
    660 * These IRQs are encoded as bit patterns so that they can be
    661 * written to the control registers.
    662 */
    663static unsigned get_irq_config(int sscape_type, int irq)
    664{
    665	static const int valid_irq[] = { 9, 5, 7, 10 };
    666	static const int old_irq[] = { 9, 7, 5, 15 };
    667	unsigned cfg;
    668
    669	if (sscape_type == MEDIA_FX) {
    670		for (cfg = 0; cfg < ARRAY_SIZE(old_irq); ++cfg)
    671			if (irq == old_irq[cfg])
    672				return cfg;
    673	} else {
    674		for (cfg = 0; cfg < ARRAY_SIZE(valid_irq); ++cfg)
    675			if (irq == valid_irq[cfg])
    676				return cfg;
    677	}
    678
    679	return INVALID_IRQ;
    680}
    681
    682/*
    683 * Perform certain arcane port-checks to see whether there
    684 * is a SoundScape board lurking behind the given ports.
    685 */
    686static int detect_sscape(struct soundscape *s, long wss_io)
    687{
    688	unsigned long flags;
    689	unsigned d;
    690	int retval = 0;
    691
    692	spin_lock_irqsave(&s->lock, flags);
    693
    694	/*
    695	 * The following code is lifted from the original OSS driver,
    696	 * and as I don't have a datasheet I cannot really comment
    697	 * on what it is doing...
    698	 */
    699	if ((inb(HOST_CTRL_IO(s->io_base)) & 0x78) != 0)
    700		goto _done;
    701
    702	d = inb(ODIE_ADDR_IO(s->io_base)) & 0xf0;
    703	if ((d & 0x80) != 0)
    704		goto _done;
    705
    706	if (d == 0)
    707		s->ic_type = IC_ODIE;
    708	else if ((d & 0x60) != 0)
    709		s->ic_type = IC_OPUS;
    710	else
    711		goto _done;
    712
    713	outb(0xfa, ODIE_ADDR_IO(s->io_base));
    714	if ((inb(ODIE_ADDR_IO(s->io_base)) & 0x9f) != 0x0a)
    715		goto _done;
    716
    717	outb(0xfe, ODIE_ADDR_IO(s->io_base));
    718	if ((inb(ODIE_ADDR_IO(s->io_base)) & 0x9f) != 0x0e)
    719		goto _done;
    720
    721	outb(0xfe, ODIE_ADDR_IO(s->io_base));
    722	d = inb(ODIE_DATA_IO(s->io_base));
    723	if (s->type != SSCAPE_VIVO && (d & 0x9f) != 0x0e)
    724		goto _done;
    725
    726	if (s->ic_type == IC_OPUS)
    727		activate_ad1845_unsafe(s->io_base);
    728
    729	if (s->type == SSCAPE_VIVO)
    730		wss_io += 4;
    731
    732	d  = sscape_read_unsafe(s->io_base, GA_HMCTL_REG);
    733	sscape_write_unsafe(s->io_base, GA_HMCTL_REG, d | 0xc0);
    734
    735	/* wait for WSS codec */
    736	for (d = 0; d < 500; d++) {
    737		if ((inb(wss_io) & 0x80) == 0)
    738			break;
    739		spin_unlock_irqrestore(&s->lock, flags);
    740		msleep(1);
    741		spin_lock_irqsave(&s->lock, flags);
    742	}
    743
    744	if ((inb(wss_io) & 0x80) != 0)
    745		goto _done;
    746
    747	if (inb(wss_io + 2) == 0xff)
    748		goto _done;
    749
    750	d  = sscape_read_unsafe(s->io_base, GA_HMCTL_REG) & 0x3f;
    751	sscape_write_unsafe(s->io_base, GA_HMCTL_REG, d);
    752
    753	if ((inb(wss_io) & 0x80) != 0)
    754		s->type = MEDIA_FX;
    755
    756	d = sscape_read_unsafe(s->io_base, GA_HMCTL_REG);
    757	sscape_write_unsafe(s->io_base, GA_HMCTL_REG, d | 0xc0);
    758	/* wait for WSS codec */
    759	for (d = 0; d < 500; d++) {
    760		if ((inb(wss_io) & 0x80) == 0)
    761			break;
    762		spin_unlock_irqrestore(&s->lock, flags);
    763		msleep(1);
    764		spin_lock_irqsave(&s->lock, flags);
    765	}
    766
    767	/*
    768	 * SoundScape successfully detected!
    769	 */
    770	retval = 1;
    771
    772_done:
    773	spin_unlock_irqrestore(&s->lock, flags);
    774	return retval;
    775}
    776
    777/*
    778 * ALSA callback function, called when attempting to open the MIDI device.
    779 * Check that the MIDI firmware has been loaded, because we don't want
    780 * to crash the machine. Also check that someone isn't using the hardware
    781 * IOCTL device.
    782 */
    783static int mpu401_open(struct snd_mpu401 *mpu)
    784{
    785	if (!verify_mpu401(mpu)) {
    786		snd_printk(KERN_ERR "sscape: MIDI disabled, "
    787				    "please load firmware\n");
    788		return -ENODEV;
    789	}
    790
    791	return 0;
    792}
    793
    794/*
    795 * Initialise an MPU-401 subdevice for MIDI support on the SoundScape.
    796 */
    797static int create_mpu401(struct snd_card *card, int devnum,
    798			 unsigned long port, int irq)
    799{
    800	struct soundscape *sscape = get_card_soundscape(card);
    801	struct snd_rawmidi *rawmidi;
    802	int err;
    803
    804	err = snd_mpu401_uart_new(card, devnum, MPU401_HW_MPU401, port,
    805				  MPU401_INFO_INTEGRATED, irq, &rawmidi);
    806	if (err == 0) {
    807		struct snd_mpu401 *mpu = rawmidi->private_data;
    808		mpu->open_input = mpu401_open;
    809		mpu->open_output = mpu401_open;
    810		mpu->private_data = sscape;
    811
    812		initialise_mpu401(mpu);
    813	}
    814
    815	return err;
    816}
    817
    818
    819/*
    820 * Create an AD1845 PCM subdevice on the SoundScape. The AD1845
    821 * is very much like a CS4231, with a few extra bits. We will
    822 * try to support at least some of the extra bits by overriding
    823 * some of the CS4231 callback.
    824 */
    825static int create_ad1845(struct snd_card *card, unsigned port,
    826			 int irq, int dma1, int dma2)
    827{
    828	register struct soundscape *sscape = get_card_soundscape(card);
    829	struct snd_wss *chip;
    830	int err;
    831	int codec_type = WSS_HW_DETECT;
    832
    833	switch (sscape->type) {
    834	case MEDIA_FX:
    835	case SSCAPE:
    836		/*
    837		 * There are some freak examples of early Soundscape cards
    838		 * with CS4231 instead of AD1848/CS4248. Unfortunately, the
    839		 * CS4231 works only in CS4248 compatibility mode on
    840		 * these cards so force it.
    841		 */
    842		if (sscape->ic_type != IC_OPUS)
    843			codec_type = WSS_HW_AD1848;
    844		break;
    845
    846	case SSCAPE_VIVO:
    847		port += 4;
    848		break;
    849	default:
    850		break;
    851	}
    852
    853	err = snd_wss_create(card, port, -1, irq, dma1, dma2,
    854			     codec_type, WSS_HWSHARE_DMA1, &chip);
    855	if (!err) {
    856		unsigned long flags;
    857
    858		if (sscape->type != SSCAPE_VIVO) {
    859			/*
    860			 * The input clock frequency on the SoundScape must
    861			 * be 14.31818 MHz, because we must set this register
    862			 * to get the playback to sound correct ...
    863			 */
    864			snd_wss_mce_up(chip);
    865			spin_lock_irqsave(&chip->reg_lock, flags);
    866			snd_wss_out(chip, AD1845_CLOCK, 0x20);
    867			spin_unlock_irqrestore(&chip->reg_lock, flags);
    868			snd_wss_mce_down(chip);
    869
    870		}
    871
    872		err = snd_wss_pcm(chip, 0);
    873		if (err < 0) {
    874			snd_printk(KERN_ERR "sscape: No PCM device "
    875					    "for AD1845 chip\n");
    876			goto _error;
    877		}
    878
    879		err = snd_wss_mixer(chip);
    880		if (err < 0) {
    881			snd_printk(KERN_ERR "sscape: No mixer device "
    882					    "for AD1845 chip\n");
    883			goto _error;
    884		}
    885		if (chip->hardware != WSS_HW_AD1848) {
    886			err = snd_wss_timer(chip, 0);
    887			if (err < 0) {
    888				snd_printk(KERN_ERR "sscape: No timer device "
    889						    "for AD1845 chip\n");
    890				goto _error;
    891			}
    892		}
    893
    894		if (sscape->type != SSCAPE_VIVO) {
    895			err = snd_ctl_add(card,
    896					  snd_ctl_new1(&midi_mixer_ctl, chip));
    897			if (err < 0) {
    898				snd_printk(KERN_ERR "sscape: Could not create "
    899						    "MIDI mixer control\n");
    900				goto _error;
    901			}
    902		}
    903
    904		sscape->chip = chip;
    905	}
    906
    907_error:
    908	return err;
    909}
    910
    911
    912/*
    913 * Create an ALSA soundcard entry for the SoundScape, using
    914 * the given list of port, IRQ and DMA resources.
    915 */
    916static int create_sscape(int dev, struct snd_card *card)
    917{
    918	struct soundscape *sscape = get_card_soundscape(card);
    919	unsigned dma_cfg;
    920	unsigned irq_cfg;
    921	unsigned mpu_irq_cfg;
    922	struct resource *io_res;
    923	struct resource *wss_res;
    924	unsigned long flags;
    925	int err;
    926	int val;
    927	const char *name;
    928
    929	/*
    930	 * Grab IO ports that we will need to probe so that we
    931	 * can detect and control this hardware ...
    932	 */
    933	io_res = devm_request_region(card->dev, port[dev], 8, "SoundScape");
    934	if (!io_res) {
    935		snd_printk(KERN_ERR
    936			   "sscape: can't grab port 0x%lx\n", port[dev]);
    937		return -EBUSY;
    938	}
    939	wss_res = NULL;
    940	if (sscape->type == SSCAPE_VIVO) {
    941		wss_res = devm_request_region(card->dev, wss_port[dev], 4,
    942					      "SoundScape");
    943		if (!wss_res) {
    944			snd_printk(KERN_ERR "sscape: can't grab port 0x%lx\n",
    945					    wss_port[dev]);
    946			return -EBUSY;
    947		}
    948	}
    949
    950	/*
    951	 * Grab one DMA channel ...
    952	 */
    953	err = snd_devm_request_dma(card->dev, dma[dev], "SoundScape");
    954	if (err < 0) {
    955		snd_printk(KERN_ERR "sscape: can't grab DMA %d\n", dma[dev]);
    956		return err;
    957	}
    958
    959	spin_lock_init(&sscape->lock);
    960	sscape->io_res = io_res;
    961	sscape->wss_res = wss_res;
    962	sscape->io_base = port[dev];
    963
    964	if (!detect_sscape(sscape, wss_port[dev])) {
    965		printk(KERN_ERR "sscape: hardware not detected at 0x%x\n",
    966			sscape->io_base);
    967		return -ENODEV;
    968	}
    969
    970	switch (sscape->type) {
    971	case MEDIA_FX:
    972		name = "MediaFX/SoundFX";
    973		break;
    974	case SSCAPE:
    975		name = "Soundscape";
    976		break;
    977	case SSCAPE_PNP:
    978		name = "Soundscape PnP";
    979		break;
    980	case SSCAPE_VIVO:
    981		name = "Soundscape VIVO";
    982		break;
    983	default:
    984		name = "unknown Soundscape";
    985		break;
    986	}
    987
    988	printk(KERN_INFO "sscape: %s card detected at 0x%x, using IRQ %d, DMA %d\n",
    989			 name, sscape->io_base, irq[dev], dma[dev]);
    990
    991	/*
    992	 * Check that the user didn't pass us garbage data ...
    993	 */
    994	irq_cfg = get_irq_config(sscape->type, irq[dev]);
    995	if (irq_cfg == INVALID_IRQ) {
    996		snd_printk(KERN_ERR "sscape: Invalid IRQ %d\n", irq[dev]);
    997		return -ENXIO;
    998	}
    999
   1000	mpu_irq_cfg = get_irq_config(sscape->type, mpu_irq[dev]);
   1001	if (mpu_irq_cfg == INVALID_IRQ) {
   1002		snd_printk(KERN_ERR "sscape: Invalid IRQ %d\n", mpu_irq[dev]);
   1003		return -ENXIO;
   1004	}
   1005
   1006	/*
   1007	 * Tell the on-board devices where their resources are (I think -
   1008	 * I can't be sure without a datasheet ... So many magic values!)
   1009	 */
   1010	spin_lock_irqsave(&sscape->lock, flags);
   1011
   1012	sscape_write_unsafe(sscape->io_base, GA_SMCFGA_REG, 0x2e);
   1013	sscape_write_unsafe(sscape->io_base, GA_SMCFGB_REG, 0x00);
   1014
   1015	/*
   1016	 * Enable and configure the DMA channels ...
   1017	 */
   1018	sscape_write_unsafe(sscape->io_base, GA_DMACFG_REG, 0x50);
   1019	dma_cfg = (sscape->ic_type == IC_OPUS ? 0x40 : 0x70);
   1020	sscape_write_unsafe(sscape->io_base, GA_DMAA_REG, dma_cfg);
   1021	sscape_write_unsafe(sscape->io_base, GA_DMAB_REG, 0x20);
   1022
   1023	mpu_irq_cfg |= mpu_irq_cfg << 2;
   1024	val = sscape_read_unsafe(sscape->io_base, GA_HMCTL_REG) & 0xF7;
   1025	if (joystick[dev])
   1026		val |= 8;
   1027	sscape_write_unsafe(sscape->io_base, GA_HMCTL_REG, val | 0x10);
   1028	sscape_write_unsafe(sscape->io_base, GA_INTCFG_REG, 0xf0 | mpu_irq_cfg);
   1029	sscape_write_unsafe(sscape->io_base,
   1030			    GA_CDCFG_REG, 0x09 | DMA_8BIT
   1031			    | (dma[dev] << 4) | (irq_cfg << 1));
   1032	/*
   1033	 * Enable the master IRQ ...
   1034	 */
   1035	sscape_write_unsafe(sscape->io_base, GA_INTENA_REG, 0x80);
   1036
   1037	spin_unlock_irqrestore(&sscape->lock, flags);
   1038
   1039	/*
   1040	 * We have now enabled the codec chip, and so we should
   1041	 * detect the AD1845 device ...
   1042	 */
   1043	err = create_ad1845(card, wss_port[dev], irq[dev],
   1044			    dma[dev], dma2[dev]);
   1045	if (err < 0) {
   1046		snd_printk(KERN_ERR
   1047				"sscape: No AD1845 device at 0x%lx, IRQ %d\n",
   1048				wss_port[dev], irq[dev]);
   1049		return err;
   1050	}
   1051	strcpy(card->driver, "SoundScape");
   1052	strcpy(card->shortname, name);
   1053	snprintf(card->longname, sizeof(card->longname),
   1054		 "%s at 0x%lx, IRQ %d, DMA1 %d, DMA2 %d\n",
   1055		 name, sscape->chip->port, sscape->chip->irq,
   1056		 sscape->chip->dma1, sscape->chip->dma2);
   1057
   1058#define MIDI_DEVNUM  0
   1059	if (sscape->type != SSCAPE_VIVO) {
   1060		err = sscape_upload_bootblock(card);
   1061		if (err >= 0)
   1062			err = sscape_upload_microcode(card, err);
   1063
   1064		if (err == 0) {
   1065			err = create_mpu401(card, MIDI_DEVNUM, port[dev],
   1066					    mpu_irq[dev]);
   1067			if (err < 0) {
   1068				snd_printk(KERN_ERR "sscape: Failed to create "
   1069						"MPU-401 device at 0x%lx\n",
   1070						port[dev]);
   1071				return err;
   1072			}
   1073
   1074			/*
   1075			 * Initialize mixer
   1076			 */
   1077			spin_lock_irqsave(&sscape->lock, flags);
   1078			sscape->midi_vol = 0;
   1079			host_write_ctrl_unsafe(sscape->io_base,
   1080						CMD_SET_MIDI_VOL, 100);
   1081			host_write_ctrl_unsafe(sscape->io_base,
   1082						sscape->midi_vol, 100);
   1083			host_write_ctrl_unsafe(sscape->io_base,
   1084						CMD_XXX_MIDI_VOL, 100);
   1085			host_write_ctrl_unsafe(sscape->io_base,
   1086						sscape->midi_vol, 100);
   1087			host_write_ctrl_unsafe(sscape->io_base,
   1088						CMD_SET_EXTMIDI, 100);
   1089			host_write_ctrl_unsafe(sscape->io_base,
   1090						0, 100);
   1091			host_write_ctrl_unsafe(sscape->io_base, CMD_ACK, 100);
   1092
   1093			set_midi_mode_unsafe(sscape->io_base);
   1094			spin_unlock_irqrestore(&sscape->lock, flags);
   1095		}
   1096	}
   1097
   1098	return 0;
   1099}
   1100
   1101
   1102static int snd_sscape_match(struct device *pdev, unsigned int i)
   1103{
   1104	/*
   1105	 * Make sure we were given ALL of the other parameters.
   1106	 */
   1107	if (port[i] == SNDRV_AUTO_PORT)
   1108		return 0;
   1109
   1110	if (irq[i] == SNDRV_AUTO_IRQ ||
   1111	    mpu_irq[i] == SNDRV_AUTO_IRQ ||
   1112	    dma[i] == SNDRV_AUTO_DMA) {
   1113		printk(KERN_INFO
   1114		       "sscape: insufficient parameters, "
   1115		       "need IO, IRQ, MPU-IRQ and DMA\n");
   1116		return 0;
   1117	}
   1118
   1119	return 1;
   1120}
   1121
   1122static int snd_sscape_probe(struct device *pdev, unsigned int dev)
   1123{
   1124	struct snd_card *card;
   1125	struct soundscape *sscape;
   1126	int ret;
   1127
   1128	ret = snd_devm_card_new(pdev, index[dev], id[dev], THIS_MODULE,
   1129				sizeof(struct soundscape), &card);
   1130	if (ret < 0)
   1131		return ret;
   1132
   1133	sscape = get_card_soundscape(card);
   1134	sscape->type = SSCAPE;
   1135
   1136	dma[dev] &= 0x03;
   1137
   1138	ret = create_sscape(dev, card);
   1139	if (ret < 0)
   1140		return ret;
   1141
   1142	ret = snd_card_register(card);
   1143	if (ret < 0) {
   1144		snd_printk(KERN_ERR "sscape: Failed to register sound card\n");
   1145		return ret;
   1146	}
   1147	dev_set_drvdata(pdev, card);
   1148	return 0;
   1149}
   1150
   1151#define DEV_NAME "sscape"
   1152
   1153static struct isa_driver snd_sscape_driver = {
   1154	.match		= snd_sscape_match,
   1155	.probe		= snd_sscape_probe,
   1156	/* FIXME: suspend/resume */
   1157	.driver		= {
   1158		.name	= DEV_NAME
   1159	},
   1160};
   1161
   1162#ifdef CONFIG_PNP
   1163static inline int get_next_autoindex(int i)
   1164{
   1165	while (i < SNDRV_CARDS && port[i] != SNDRV_AUTO_PORT)
   1166		++i;
   1167	return i;
   1168}
   1169
   1170
   1171static int sscape_pnp_detect(struct pnp_card_link *pcard,
   1172			     const struct pnp_card_device_id *pid)
   1173{
   1174	static int idx = 0;
   1175	struct pnp_dev *dev;
   1176	struct snd_card *card;
   1177	struct soundscape *sscape;
   1178	int ret;
   1179
   1180	/*
   1181	 * Allow this function to fail *quietly* if all the ISA PnP
   1182	 * devices were configured using module parameters instead.
   1183	 */
   1184	idx = get_next_autoindex(idx);
   1185	if (idx >= SNDRV_CARDS)
   1186		return -ENOSPC;
   1187
   1188	/*
   1189	 * Check that we still have room for another sound card ...
   1190	 */
   1191	dev = pnp_request_card_device(pcard, pid->devs[0].id, NULL);
   1192	if (!dev)
   1193		return -ENODEV;
   1194
   1195	if (!pnp_is_active(dev)) {
   1196		if (pnp_activate_dev(dev) < 0) {
   1197			snd_printk(KERN_INFO "sscape: device is inactive\n");
   1198			return -EBUSY;
   1199		}
   1200	}
   1201
   1202	/*
   1203	 * Create a new ALSA sound card entry, in anticipation
   1204	 * of detecting our hardware ...
   1205	 */
   1206	ret = snd_devm_card_new(&pcard->card->dev,
   1207				index[idx], id[idx], THIS_MODULE,
   1208				sizeof(struct soundscape), &card);
   1209	if (ret < 0)
   1210		return ret;
   1211
   1212	sscape = get_card_soundscape(card);
   1213
   1214	/*
   1215	 * Identify card model ...
   1216	 */
   1217	if (!strncmp("ENS4081", pid->id, 7))
   1218		sscape->type = SSCAPE_VIVO;
   1219	else
   1220		sscape->type = SSCAPE_PNP;
   1221
   1222	/*
   1223	 * Read the correct parameters off the ISA PnP bus ...
   1224	 */
   1225	port[idx] = pnp_port_start(dev, 0);
   1226	irq[idx] = pnp_irq(dev, 0);
   1227	mpu_irq[idx] = pnp_irq(dev, 1);
   1228	dma[idx] = pnp_dma(dev, 0) & 0x03;
   1229	if (sscape->type == SSCAPE_PNP) {
   1230		dma2[idx] = dma[idx];
   1231		wss_port[idx] = CODEC_IO(port[idx]);
   1232	} else {
   1233		wss_port[idx] = pnp_port_start(dev, 1);
   1234		dma2[idx] = pnp_dma(dev, 1);
   1235	}
   1236
   1237	ret = create_sscape(idx, card);
   1238	if (ret < 0)
   1239		return ret;
   1240
   1241	ret = snd_card_register(card);
   1242	if (ret < 0) {
   1243		snd_printk(KERN_ERR "sscape: Failed to register sound card\n");
   1244		return ret;
   1245	}
   1246
   1247	pnp_set_card_drvdata(pcard, card);
   1248	++idx;
   1249	return 0;
   1250}
   1251
   1252static struct pnp_card_driver sscape_pnpc_driver = {
   1253	.flags = PNP_DRIVER_RES_DO_NOT_CHANGE,
   1254	.name = "sscape",
   1255	.id_table = sscape_pnpids,
   1256	.probe = sscape_pnp_detect,
   1257};
   1258
   1259#endif /* CONFIG_PNP */
   1260
   1261static int __init sscape_init(void)
   1262{
   1263	int err;
   1264
   1265	err = isa_register_driver(&snd_sscape_driver, SNDRV_CARDS);
   1266#ifdef CONFIG_PNP
   1267	if (!err)
   1268		isa_registered = 1;
   1269
   1270	err = pnp_register_card_driver(&sscape_pnpc_driver);
   1271	if (!err)
   1272		pnp_registered = 1;
   1273
   1274	if (isa_registered)
   1275		err = 0;
   1276#endif
   1277	return err;
   1278}
   1279
   1280static void __exit sscape_exit(void)
   1281{
   1282#ifdef CONFIG_PNP
   1283	if (pnp_registered)
   1284		pnp_unregister_card_driver(&sscape_pnpc_driver);
   1285	if (isa_registered)
   1286#endif
   1287		isa_unregister_driver(&snd_sscape_driver);
   1288}
   1289
   1290module_init(sscape_init);
   1291module_exit(sscape_exit);