MODULE_AUTHOR("Clemens Ladisch <clemens@ladisch.de>");
MODULE_DESCRIPTION("OPL4 driver");
MODULE_LICENSE("GPL");
-MODULE_CLASSES("{sound}");
static void inline snd_opl4_wait(opl4_t *opl4)
{
void snd_opl4_write(opl4_t *opl4, u8 reg, u8 value)
{
- unsigned long flags;
-
- spin_lock_irqsave(&opl4->reg_lock, flags);
-
snd_opl4_wait(opl4);
outb(reg, opl4->pcm_port);
snd_opl4_wait(opl4);
outb(value, opl4->pcm_port + 1);
-
- spin_unlock_irqrestore(&opl4->reg_lock, flags);
}
u8 snd_opl4_read(opl4_t *opl4, u8 reg)
{
- unsigned long flags;
- u8 value;
-
- spin_lock_irqsave(&opl4->reg_lock, flags);
-
snd_opl4_wait(opl4);
outb(reg, opl4->pcm_port);
snd_opl4_wait(opl4);
- value = inb(opl4->pcm_port + 1);
-
- spin_unlock_irqrestore(&opl4->reg_lock, flags);
- return value;
+ return inb(opl4->pcm_port + 1);
}
void snd_opl4_read_memory(opl4_t *opl4, char *buf, int offset, int size)
{
- u8 memcfg = snd_opl4_read(opl4, OPL4_REG_MEMORY_CONFIGURATION);
+ unsigned long flags;
+ u8 memcfg;
+
+ spin_lock_irqsave(&opl4->reg_lock, flags);
+
+ memcfg = snd_opl4_read(opl4, OPL4_REG_MEMORY_CONFIGURATION);
snd_opl4_write(opl4, OPL4_REG_MEMORY_CONFIGURATION, memcfg | OPL4_MODE_BIT);
snd_opl4_write(opl4, OPL4_REG_MEMORY_ADDRESS_HIGH, offset >> 16);
snd_opl4_write(opl4, OPL4_REG_MEMORY_ADDRESS_MID, offset >> 8);
snd_opl4_write(opl4, OPL4_REG_MEMORY_ADDRESS_LOW, offset);
- for (; size > 0; size--)
- *buf++ = snd_opl4_read(opl4, OPL4_REG_MEMORY_DATA);
+
+ snd_opl4_wait(opl4);
+ outb(OPL4_REG_MEMORY_DATA, opl4->pcm_port);
+ snd_opl4_wait(opl4);
+ insb(opl4->pcm_port + 1, buf, size);
snd_opl4_write(opl4, OPL4_REG_MEMORY_CONFIGURATION, memcfg);
+
+ spin_unlock_irqrestore(&opl4->reg_lock, flags);
}
void snd_opl4_write_memory(opl4_t *opl4, const char *buf, int offset, int size)
{
- u8 memcfg = snd_opl4_read(opl4, OPL4_REG_MEMORY_CONFIGURATION);
+ unsigned long flags;
+ u8 memcfg;
+
+ spin_lock_irqsave(&opl4->reg_lock, flags);
+
+ memcfg = snd_opl4_read(opl4, OPL4_REG_MEMORY_CONFIGURATION);
snd_opl4_write(opl4, OPL4_REG_MEMORY_CONFIGURATION, memcfg | OPL4_MODE_BIT);
snd_opl4_write(opl4, OPL4_REG_MEMORY_ADDRESS_HIGH, offset >> 16);
snd_opl4_write(opl4, OPL4_REG_MEMORY_ADDRESS_MID, offset >> 8);
snd_opl4_write(opl4, OPL4_REG_MEMORY_ADDRESS_LOW, offset);
- for (; size > 0; size--)
- snd_opl4_write(opl4, OPL4_REG_MEMORY_DATA, *buf++);
+
+ snd_opl4_wait(opl4);
+ outb(OPL4_REG_MEMORY_DATA, opl4->pcm_port);
+ snd_opl4_wait(opl4);
+ outsb(opl4->pcm_port + 1, buf, size);
snd_opl4_write(opl4, OPL4_REG_MEMORY_CONFIGURATION, memcfg);
+
+ spin_unlock_irqrestore(&opl4->reg_lock, flags);
}
static void snd_opl4_enable_opl4(opl4_t *opl4)
#if defined(CONFIG_SND_SEQUENCER) || (defined(MODULE) && defined(CONFIG_SND_SEQUENCER_MODULE))
static void snd_opl4_seq_dev_free(snd_seq_device_t *seq_dev)
{
- opl4_t *opl4 = snd_magic_cast(opl4_t, seq_dev->private_data, return);
+ opl4_t *opl4 = seq_dev->private_data;
opl4->seq_dev = NULL;
}
release_resource(opl4->res_pcm_port);
kfree_nocheck(opl4->res_pcm_port);
}
- snd_magic_kfree(opl4);
+ kfree(opl4);
}
static int snd_opl4_dev_free(snd_device_t *device)
{
- opl4_t *opl4 = snd_magic_cast(opl4_t, device->device_data, return -ENXIO);
+ opl4_t *opl4 = device->device_data;
snd_opl4_free(opl4);
return 0;
}
if (ropl4)
*ropl4 = NULL;
- opl4 = snd_magic_kcalloc(opl4_t, 0, GFP_KERNEL);
+ opl4 = kcalloc(1, sizeof(*opl4), GFP_KERNEL);
if (!opl4)
return -ENOMEM;
}
/* opl3 initialization disabled opl4, so reenable */
- snd_opl4_enable_opl4(opl4);
+ snd_opl4_enable_opl4(opl4);
err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, opl4, &ops);
if (err < 0) {