Merge branch 'topic/ice' into for-linus
This commit is contained in:
@@ -458,7 +458,7 @@ static irqreturn_t snd_ice1712_interrupt(int irq, void *dev_id)
|
|||||||
u16 pbkstatus;
|
u16 pbkstatus;
|
||||||
struct snd_pcm_substream *substream;
|
struct snd_pcm_substream *substream;
|
||||||
pbkstatus = inw(ICEDS(ice, INTSTAT));
|
pbkstatus = inw(ICEDS(ice, INTSTAT));
|
||||||
/* printk("pbkstatus = 0x%x\n", pbkstatus); */
|
/* printk(KERN_DEBUG "pbkstatus = 0x%x\n", pbkstatus); */
|
||||||
for (idx = 0; idx < 6; idx++) {
|
for (idx = 0; idx < 6; idx++) {
|
||||||
if ((pbkstatus & (3 << (idx * 2))) == 0)
|
if ((pbkstatus & (3 << (idx * 2))) == 0)
|
||||||
continue;
|
continue;
|
||||||
|
@@ -241,6 +241,8 @@ get_rawmidi_substream(struct snd_ice1712 *ice, unsigned int stream)
|
|||||||
struct snd_rawmidi_substream, list);
|
struct snd_rawmidi_substream, list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void enable_midi_irq(struct snd_ice1712 *ice, u8 flag, int enable);
|
||||||
|
|
||||||
static void vt1724_midi_write(struct snd_ice1712 *ice)
|
static void vt1724_midi_write(struct snd_ice1712 *ice)
|
||||||
{
|
{
|
||||||
struct snd_rawmidi_substream *s;
|
struct snd_rawmidi_substream *s;
|
||||||
@@ -254,6 +256,11 @@ static void vt1724_midi_write(struct snd_ice1712 *ice)
|
|||||||
for (i = 0; i < count; ++i)
|
for (i = 0; i < count; ++i)
|
||||||
outb(buffer[i], ICEREG1724(ice, MPU_DATA));
|
outb(buffer[i], ICEREG1724(ice, MPU_DATA));
|
||||||
}
|
}
|
||||||
|
/* mask irq when all bytes have been transmitted.
|
||||||
|
* enabled again in output_trigger when the new data comes in.
|
||||||
|
*/
|
||||||
|
enable_midi_irq(ice, VT1724_IRQ_MPU_TX,
|
||||||
|
!snd_rawmidi_transmit_empty(s));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vt1724_midi_read(struct snd_ice1712 *ice)
|
static void vt1724_midi_read(struct snd_ice1712 *ice)
|
||||||
@@ -272,31 +279,34 @@ static void vt1724_midi_read(struct snd_ice1712 *ice)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vt1724_enable_midi_irq(struct snd_rawmidi_substream *substream,
|
/* call with ice->reg_lock */
|
||||||
u8 flag, int enable)
|
static void enable_midi_irq(struct snd_ice1712 *ice, u8 flag, int enable)
|
||||||
{
|
{
|
||||||
struct snd_ice1712 *ice = substream->rmidi->private_data;
|
u8 mask = inb(ICEREG1724(ice, IRQMASK));
|
||||||
u8 mask;
|
|
||||||
|
|
||||||
spin_lock_irq(&ice->reg_lock);
|
|
||||||
mask = inb(ICEREG1724(ice, IRQMASK));
|
|
||||||
if (enable)
|
if (enable)
|
||||||
mask &= ~flag;
|
mask &= ~flag;
|
||||||
else
|
else
|
||||||
mask |= flag;
|
mask |= flag;
|
||||||
outb(mask, ICEREG1724(ice, IRQMASK));
|
outb(mask, ICEREG1724(ice, IRQMASK));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void vt1724_enable_midi_irq(struct snd_rawmidi_substream *substream,
|
||||||
|
u8 flag, int enable)
|
||||||
|
{
|
||||||
|
struct snd_ice1712 *ice = substream->rmidi->private_data;
|
||||||
|
|
||||||
|
spin_lock_irq(&ice->reg_lock);
|
||||||
|
enable_midi_irq(ice, flag, enable);
|
||||||
spin_unlock_irq(&ice->reg_lock);
|
spin_unlock_irq(&ice->reg_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int vt1724_midi_output_open(struct snd_rawmidi_substream *s)
|
static int vt1724_midi_output_open(struct snd_rawmidi_substream *s)
|
||||||
{
|
{
|
||||||
vt1724_enable_midi_irq(s, VT1724_IRQ_MPU_TX, 1);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int vt1724_midi_output_close(struct snd_rawmidi_substream *s)
|
static int vt1724_midi_output_close(struct snd_rawmidi_substream *s)
|
||||||
{
|
{
|
||||||
vt1724_enable_midi_irq(s, VT1724_IRQ_MPU_TX, 0);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -311,6 +321,7 @@ static void vt1724_midi_output_trigger(struct snd_rawmidi_substream *s, int up)
|
|||||||
vt1724_midi_write(ice);
|
vt1724_midi_write(ice);
|
||||||
} else {
|
} else {
|
||||||
ice->midi_output = 0;
|
ice->midi_output = 0;
|
||||||
|
enable_midi_irq(ice, VT1724_IRQ_MPU_TX, 0);
|
||||||
}
|
}
|
||||||
spin_unlock_irqrestore(&ice->reg_lock, flags);
|
spin_unlock_irqrestore(&ice->reg_lock, flags);
|
||||||
}
|
}
|
||||||
@@ -320,6 +331,7 @@ static void vt1724_midi_output_drain(struct snd_rawmidi_substream *s)
|
|||||||
struct snd_ice1712 *ice = s->rmidi->private_data;
|
struct snd_ice1712 *ice = s->rmidi->private_data;
|
||||||
unsigned long timeout;
|
unsigned long timeout;
|
||||||
|
|
||||||
|
vt1724_enable_midi_irq(s, VT1724_IRQ_MPU_TX, 0);
|
||||||
/* 32 bytes should be transmitted in less than about 12 ms */
|
/* 32 bytes should be transmitted in less than about 12 ms */
|
||||||
timeout = jiffies + msecs_to_jiffies(15);
|
timeout = jiffies + msecs_to_jiffies(15);
|
||||||
do {
|
do {
|
||||||
@@ -389,24 +401,24 @@ static irqreturn_t snd_vt1724_interrupt(int irq, void *dev_id)
|
|||||||
status &= status_mask;
|
status &= status_mask;
|
||||||
if (status == 0)
|
if (status == 0)
|
||||||
break;
|
break;
|
||||||
|
spin_lock(&ice->reg_lock);
|
||||||
if (++timeout > 10) {
|
if (++timeout > 10) {
|
||||||
status = inb(ICEREG1724(ice, IRQSTAT));
|
status = inb(ICEREG1724(ice, IRQSTAT));
|
||||||
printk(KERN_ERR "ice1724: Too long irq loop, "
|
printk(KERN_ERR "ice1724: Too long irq loop, "
|
||||||
"status = 0x%x\n", status);
|
"status = 0x%x\n", status);
|
||||||
if (status & VT1724_IRQ_MPU_TX) {
|
if (status & VT1724_IRQ_MPU_TX) {
|
||||||
printk(KERN_ERR "ice1724: Disabling MPU_TX\n");
|
printk(KERN_ERR "ice1724: Disabling MPU_TX\n");
|
||||||
outb(inb(ICEREG1724(ice, IRQMASK)) |
|
enable_midi_irq(ice, VT1724_IRQ_MPU_TX, 0);
|
||||||
VT1724_IRQ_MPU_TX,
|
|
||||||
ICEREG1724(ice, IRQMASK));
|
|
||||||
}
|
}
|
||||||
|
spin_unlock(&ice->reg_lock);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
handled = 1;
|
handled = 1;
|
||||||
if (status & VT1724_IRQ_MPU_TX) {
|
if (status & VT1724_IRQ_MPU_TX) {
|
||||||
spin_lock(&ice->reg_lock);
|
|
||||||
if (ice->midi_output)
|
if (ice->midi_output)
|
||||||
vt1724_midi_write(ice);
|
vt1724_midi_write(ice);
|
||||||
spin_unlock(&ice->reg_lock);
|
else
|
||||||
|
enable_midi_irq(ice, VT1724_IRQ_MPU_TX, 0);
|
||||||
/* Due to mysterical reasons, MPU_TX is always
|
/* Due to mysterical reasons, MPU_TX is always
|
||||||
* generated (and can't be cleared) when a PCM
|
* generated (and can't be cleared) when a PCM
|
||||||
* playback is going. So let's ignore at the
|
* playback is going. So let's ignore at the
|
||||||
@@ -415,15 +427,14 @@ static irqreturn_t snd_vt1724_interrupt(int irq, void *dev_id)
|
|||||||
status_mask &= ~VT1724_IRQ_MPU_TX;
|
status_mask &= ~VT1724_IRQ_MPU_TX;
|
||||||
}
|
}
|
||||||
if (status & VT1724_IRQ_MPU_RX) {
|
if (status & VT1724_IRQ_MPU_RX) {
|
||||||
spin_lock(&ice->reg_lock);
|
|
||||||
if (ice->midi_input)
|
if (ice->midi_input)
|
||||||
vt1724_midi_read(ice);
|
vt1724_midi_read(ice);
|
||||||
else
|
else
|
||||||
vt1724_midi_clear_rx(ice);
|
vt1724_midi_clear_rx(ice);
|
||||||
spin_unlock(&ice->reg_lock);
|
|
||||||
}
|
}
|
||||||
/* ack MPU irq */
|
/* ack MPU irq */
|
||||||
outb(status, ICEREG1724(ice, IRQSTAT));
|
outb(status, ICEREG1724(ice, IRQSTAT));
|
||||||
|
spin_unlock(&ice->reg_lock);
|
||||||
if (status & VT1724_IRQ_MTPCM) {
|
if (status & VT1724_IRQ_MTPCM) {
|
||||||
/*
|
/*
|
||||||
* Multi-track PCM
|
* Multi-track PCM
|
||||||
@@ -745,7 +756,14 @@ static int snd_vt1724_playback_pro_prepare(struct snd_pcm_substream *substream)
|
|||||||
|
|
||||||
spin_unlock_irq(&ice->reg_lock);
|
spin_unlock_irq(&ice->reg_lock);
|
||||||
|
|
||||||
/* printk("pro prepare: ch = %d, addr = 0x%x, buffer = 0x%x, period = 0x%x\n", substream->runtime->channels, (unsigned int)substream->runtime->dma_addr, snd_pcm_lib_buffer_bytes(substream), snd_pcm_lib_period_bytes(substream)); */
|
/*
|
||||||
|
printk(KERN_DEBUG "pro prepare: ch = %d, addr = 0x%x, "
|
||||||
|
"buffer = 0x%x, period = 0x%x\n",
|
||||||
|
substream->runtime->channels,
|
||||||
|
(unsigned int)substream->runtime->dma_addr,
|
||||||
|
snd_pcm_lib_buffer_bytes(substream),
|
||||||
|
snd_pcm_lib_period_bytes(substream));
|
||||||
|
*/
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2122,7 +2140,9 @@ unsigned char snd_vt1724_read_i2c(struct snd_ice1712 *ice,
|
|||||||
wait_i2c_busy(ice);
|
wait_i2c_busy(ice);
|
||||||
val = inb(ICEREG1724(ice, I2C_DATA));
|
val = inb(ICEREG1724(ice, I2C_DATA));
|
||||||
mutex_unlock(&ice->i2c_mutex);
|
mutex_unlock(&ice->i2c_mutex);
|
||||||
/* printk("i2c_read: [0x%x,0x%x] = 0x%x\n", dev, addr, val); */
|
/*
|
||||||
|
printk(KERN_DEBUG "i2c_read: [0x%x,0x%x] = 0x%x\n", dev, addr, val);
|
||||||
|
*/
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2131,7 +2151,9 @@ void snd_vt1724_write_i2c(struct snd_ice1712 *ice,
|
|||||||
{
|
{
|
||||||
mutex_lock(&ice->i2c_mutex);
|
mutex_lock(&ice->i2c_mutex);
|
||||||
wait_i2c_busy(ice);
|
wait_i2c_busy(ice);
|
||||||
/* printk("i2c_write: [0x%x,0x%x] = 0x%x\n", dev, addr, data); */
|
/*
|
||||||
|
printk(KERN_DEBUG "i2c_write: [0x%x,0x%x] = 0x%x\n", dev, addr, data);
|
||||||
|
*/
|
||||||
outb(addr, ICEREG1724(ice, I2C_BYTE_ADDR));
|
outb(addr, ICEREG1724(ice, I2C_BYTE_ADDR));
|
||||||
outb(data, ICEREG1724(ice, I2C_DATA));
|
outb(data, ICEREG1724(ice, I2C_DATA));
|
||||||
outb(dev | VT1724_I2C_WRITE, ICEREG1724(ice, I2C_DEV_ADDR));
|
outb(dev | VT1724_I2C_WRITE, ICEREG1724(ice, I2C_DEV_ADDR));
|
||||||
|
@@ -345,8 +345,9 @@ static int juli_mute_put(struct snd_kcontrol *kcontrol,
|
|||||||
new_gpio = old_gpio &
|
new_gpio = old_gpio &
|
||||||
~((unsigned int) kcontrol->private_value);
|
~((unsigned int) kcontrol->private_value);
|
||||||
}
|
}
|
||||||
/* printk("JULI - mute/unmute: control_value: 0x%x, old_gpio: 0x%x, \
|
/* printk(KERN_DEBUG
|
||||||
new_gpio 0x%x\n",
|
"JULI - mute/unmute: control_value: 0x%x, old_gpio: 0x%x, "
|
||||||
|
"new_gpio 0x%x\n",
|
||||||
(unsigned int)ucontrol->value.integer.value[0], old_gpio,
|
(unsigned int)ucontrol->value.integer.value[0], old_gpio,
|
||||||
new_gpio); */
|
new_gpio); */
|
||||||
if (old_gpio != new_gpio) {
|
if (old_gpio != new_gpio) {
|
||||||
|
@@ -133,8 +133,10 @@ static int stac9460_dac_mute_put(struct snd_kcontrol *kcontrol, struct snd_ctl_e
|
|||||||
idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id) + STAC946X_LF_VOLUME;
|
idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id) + STAC946X_LF_VOLUME;
|
||||||
/* due to possible conflicts with stac9460_set_rate_val, mutexing */
|
/* due to possible conflicts with stac9460_set_rate_val, mutexing */
|
||||||
mutex_lock(&spec->mute_mutex);
|
mutex_lock(&spec->mute_mutex);
|
||||||
/*printk("Mute put: reg 0x%02x, ctrl value: 0x%02x\n", idx,
|
/*
|
||||||
ucontrol->value.integer.value[0]);*/
|
printk(KERN_DEBUG "Mute put: reg 0x%02x, ctrl value: 0x%02x\n", idx,
|
||||||
|
ucontrol->value.integer.value[0]);
|
||||||
|
*/
|
||||||
change = stac9460_dac_mute(ice, idx, ucontrol->value.integer.value[0]);
|
change = stac9460_dac_mute(ice, idx, ucontrol->value.integer.value[0]);
|
||||||
mutex_unlock(&spec->mute_mutex);
|
mutex_unlock(&spec->mute_mutex);
|
||||||
return change;
|
return change;
|
||||||
@@ -185,7 +187,10 @@ static int stac9460_dac_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_el
|
|||||||
change = (ovol != nvol);
|
change = (ovol != nvol);
|
||||||
if (change) {
|
if (change) {
|
||||||
ovol = (0x7f - nvol) | (tmp & 0x80);
|
ovol = (0x7f - nvol) | (tmp & 0x80);
|
||||||
/*printk("DAC Volume: reg 0x%02x: 0x%02x\n", idx, ovol);*/
|
/*
|
||||||
|
printk(KERN_DEBUG "DAC Volume: reg 0x%02x: 0x%02x\n",
|
||||||
|
idx, ovol);
|
||||||
|
*/
|
||||||
stac9460_put(ice, idx, (0x7f - nvol) | (tmp & 0x80));
|
stac9460_put(ice, idx, (0x7f - nvol) | (tmp & 0x80));
|
||||||
}
|
}
|
||||||
return change;
|
return change;
|
||||||
@@ -344,7 +349,7 @@ static void stac9460_set_rate_val(struct snd_ice1712 *ice, unsigned int rate)
|
|||||||
for (idx = 0; idx < 7 ; ++idx)
|
for (idx = 0; idx < 7 ; ++idx)
|
||||||
changed[idx] = stac9460_dac_mute(ice,
|
changed[idx] = stac9460_dac_mute(ice,
|
||||||
STAC946X_MASTER_VOLUME + idx, 0);
|
STAC946X_MASTER_VOLUME + idx, 0);
|
||||||
/*printk("Rate change: %d, new MC: 0x%02x\n", rate, new);*/
|
/*printk(KERN_DEBUG "Rate change: %d, new MC: 0x%02x\n", rate, new);*/
|
||||||
stac9460_put(ice, STAC946X_MASTER_CLOCKING, new);
|
stac9460_put(ice, STAC946X_MASTER_CLOCKING, new);
|
||||||
udelay(10);
|
udelay(10);
|
||||||
/* unmuting - only originally unmuted dacs -
|
/* unmuting - only originally unmuted dacs -
|
||||||
|
Reference in New Issue
Block a user