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); 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_write(opl4, OPL4_REG_MEMORY_CONFIGURATION, memcfg); }
static int snd_opl4_ctl_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol) { opl4_t *opl4 = snd_kcontrol_chip(kcontrol); u8 reg = kcontrol->private_value; u8 value, old_value; value = (7 - (ucontrol->value.integer.value[0] & 7)) | ((7 - (ucontrol->value.integer.value[1] & 7)) << 3); old_value = snd_opl4_read(opl4, reg); snd_opl4_write(opl4, reg, value); return value != old_value; }
void snd_opl4_write_memory(struct snd_opl4 *opl4, const char *buf, int offset, int size) { 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); 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 int snd_opl4_ctl_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol) { opl4_t *opl4 = snd_kcontrol_chip(kcontrol); unsigned long flags; u8 reg = kcontrol->private_value; u8 value, old_value; value = (7 - (ucontrol->value.integer.value[0] & 7)) | ((7 - (ucontrol->value.integer.value[1] & 7)) << 3); spin_lock_irqsave(&opl4->reg_lock, flags); old_value = snd_opl4_read(opl4, reg); snd_opl4_write(opl4, reg, value); spin_unlock_irqrestore(&opl4->reg_lock, flags); return value != old_value; }