Commit 60c4e7c1 authored by Takashi Iwai's avatar Takashi Iwai

Merge branch 'topic/ice' into for-linus

parents 593aff6c e2ea7cfc
...@@ -458,7 +458,7 @@ static irqreturn_t snd_ice1712_interrupt(int irq, void *dev_id) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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 ...@@ -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 ...@@ -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) ...@@ -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 -
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment