Commit c8bdfacb authored by Takashi Iwai's avatar Takashi Iwai

Merge branch 'fix/misc' into topic/misc

parents add7c0a6 a7a13d06
...@@ -829,6 +829,8 @@ static int snd_rawmidi_control_ioctl(struct snd_card *card, ...@@ -829,6 +829,8 @@ static int snd_rawmidi_control_ioctl(struct snd_card *card,
if (get_user(device, (int __user *)argp)) if (get_user(device, (int __user *)argp))
return -EFAULT; return -EFAULT;
if (device >= SNDRV_RAWMIDI_DEVICES) /* next device is -1 */
device = SNDRV_RAWMIDI_DEVICES - 1;
mutex_lock(&register_mutex); mutex_lock(&register_mutex);
device = device < 0 ? 0 : device + 1; device = device < 0 ? 0 : device + 1;
while (device < SNDRV_RAWMIDI_DEVICES) { while (device < SNDRV_RAWMIDI_DEVICES) {
......
...@@ -281,13 +281,10 @@ snd_seq_oss_open(struct file *file, int level) ...@@ -281,13 +281,10 @@ snd_seq_oss_open(struct file *file, int level)
return 0; return 0;
_error: _error:
snd_seq_oss_writeq_delete(dp->writeq);
snd_seq_oss_readq_delete(dp->readq);
snd_seq_oss_synth_cleanup(dp); snd_seq_oss_synth_cleanup(dp);
snd_seq_oss_midi_cleanup(dp); snd_seq_oss_midi_cleanup(dp);
delete_port(dp);
delete_seq_queue(dp->queue); delete_seq_queue(dp->queue);
kfree(dp); delete_port(dp);
return rc; return rc;
} }
...@@ -350,8 +347,10 @@ create_port(struct seq_oss_devinfo *dp) ...@@ -350,8 +347,10 @@ create_port(struct seq_oss_devinfo *dp)
static int static int
delete_port(struct seq_oss_devinfo *dp) delete_port(struct seq_oss_devinfo *dp)
{ {
if (dp->port < 0) if (dp->port < 0) {
kfree(dp);
return 0; return 0;
}
debug_printk(("delete_port %i\n", dp->port)); debug_printk(("delete_port %i\n", dp->port));
return snd_seq_event_port_detach(dp->cseq, dp->port); return snd_seq_event_port_detach(dp->cseq, dp->port);
......
...@@ -764,9 +764,9 @@ static long io[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; ...@@ -764,9 +764,9 @@ static long io[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
static int irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ; static int irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ;
static long mem[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; static long mem[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
#ifndef MSND_CLASSIC
static long cfg[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; static long cfg[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
#ifndef MSND_CLASSIC
/* Extra Peripheral Configuration (Default: Disable) */ /* Extra Peripheral Configuration (Default: Disable) */
static long ide_io0[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; static long ide_io0[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
static long ide_io1[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; static long ide_io1[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
...@@ -894,7 +894,11 @@ static int __devinit snd_msnd_isa_probe(struct device *pdev, unsigned int idx) ...@@ -894,7 +894,11 @@ static int __devinit snd_msnd_isa_probe(struct device *pdev, unsigned int idx)
struct snd_card *card; struct snd_card *card;
struct snd_msnd *chip; struct snd_msnd *chip;
if (has_isapnp(idx) || cfg[idx] == SNDRV_AUTO_PORT) { if (has_isapnp(idx)
#ifndef MSND_CLASSIC
|| cfg[idx] == SNDRV_AUTO_PORT
#endif
) {
printk(KERN_INFO LOGNAME ": Assuming PnP mode\n"); printk(KERN_INFO LOGNAME ": Assuming PnP mode\n");
return -ENODEV; return -ENODEV;
} }
......
...@@ -155,6 +155,7 @@ void oxygen_pci_remove(struct pci_dev *pci); ...@@ -155,6 +155,7 @@ void oxygen_pci_remove(struct pci_dev *pci);
int oxygen_pci_suspend(struct pci_dev *pci, pm_message_t state); int oxygen_pci_suspend(struct pci_dev *pci, pm_message_t state);
int oxygen_pci_resume(struct pci_dev *pci); int oxygen_pci_resume(struct pci_dev *pci);
#endif #endif
void oxygen_pci_shutdown(struct pci_dev *pci);
/* oxygen_mixer.c */ /* oxygen_mixer.c */
......
...@@ -519,16 +519,21 @@ static void oxygen_init(struct oxygen *chip) ...@@ -519,16 +519,21 @@ static void oxygen_init(struct oxygen *chip)
} }
} }
static void oxygen_card_free(struct snd_card *card) static void oxygen_shutdown(struct oxygen *chip)
{ {
struct oxygen *chip = card->private_data;
spin_lock_irq(&chip->reg_lock); spin_lock_irq(&chip->reg_lock);
chip->interrupt_mask = 0; chip->interrupt_mask = 0;
chip->pcm_running = 0; chip->pcm_running = 0;
oxygen_write16(chip, OXYGEN_DMA_STATUS, 0); oxygen_write16(chip, OXYGEN_DMA_STATUS, 0);
oxygen_write16(chip, OXYGEN_INTERRUPT_MASK, 0); oxygen_write16(chip, OXYGEN_INTERRUPT_MASK, 0);
spin_unlock_irq(&chip->reg_lock); spin_unlock_irq(&chip->reg_lock);
}
static void oxygen_card_free(struct snd_card *card)
{
struct oxygen *chip = card->private_data;
oxygen_shutdown(chip);
if (chip->irq >= 0) if (chip->irq >= 0)
free_irq(chip->irq, chip); free_irq(chip->irq, chip);
flush_scheduled_work(); flush_scheduled_work();
...@@ -778,3 +783,13 @@ int oxygen_pci_resume(struct pci_dev *pci) ...@@ -778,3 +783,13 @@ int oxygen_pci_resume(struct pci_dev *pci)
} }
EXPORT_SYMBOL(oxygen_pci_resume); EXPORT_SYMBOL(oxygen_pci_resume);
#endif /* CONFIG_PM */ #endif /* CONFIG_PM */
void oxygen_pci_shutdown(struct pci_dev *pci)
{
struct snd_card *card = pci_get_drvdata(pci);
struct oxygen *chip = card->private_data;
oxygen_shutdown(chip);
chip->model.cleanup(chip);
}
EXPORT_SYMBOL(oxygen_pci_shutdown);
...@@ -95,6 +95,7 @@ static struct pci_driver xonar_driver = { ...@@ -95,6 +95,7 @@ static struct pci_driver xonar_driver = {
.suspend = oxygen_pci_suspend, .suspend = oxygen_pci_suspend,
.resume = oxygen_pci_resume, .resume = oxygen_pci_resume,
#endif #endif
.shutdown = oxygen_pci_shutdown,
}; };
static int __init alsa_card_xonar_init(void) static int __init alsa_card_xonar_init(void)
......
...@@ -53,6 +53,8 @@ struct xonar_wm87x6 { ...@@ -53,6 +53,8 @@ struct xonar_wm87x6 {
struct xonar_generic generic; struct xonar_generic generic;
u16 wm8776_regs[0x17]; u16 wm8776_regs[0x17];
u16 wm8766_regs[0x10]; u16 wm8766_regs[0x10];
struct snd_kcontrol *line_adcmux_control;
struct snd_kcontrol *mic_adcmux_control;
struct snd_kcontrol *lc_controls[13]; struct snd_kcontrol *lc_controls[13];
}; };
...@@ -193,6 +195,7 @@ static void xonar_ds_init(struct oxygen *chip) ...@@ -193,6 +195,7 @@ static void xonar_ds_init(struct oxygen *chip)
static void xonar_ds_cleanup(struct oxygen *chip) static void xonar_ds_cleanup(struct oxygen *chip)
{ {
xonar_disable_output(chip); xonar_disable_output(chip);
wm8776_write(chip, WM8776_RESET, 0);
} }
static void xonar_ds_suspend(struct oxygen *chip) static void xonar_ds_suspend(struct oxygen *chip)
...@@ -603,6 +606,7 @@ static int wm8776_input_mux_put(struct snd_kcontrol *ctl, ...@@ -603,6 +606,7 @@ static int wm8776_input_mux_put(struct snd_kcontrol *ctl,
{ {
struct oxygen *chip = ctl->private_data; struct oxygen *chip = ctl->private_data;
struct xonar_wm87x6 *data = chip->model_data; struct xonar_wm87x6 *data = chip->model_data;
struct snd_kcontrol *other_ctl;
unsigned int mux_bit = ctl->private_value; unsigned int mux_bit = ctl->private_value;
u16 reg; u16 reg;
int changed; int changed;
...@@ -610,8 +614,18 @@ static int wm8776_input_mux_put(struct snd_kcontrol *ctl, ...@@ -610,8 +614,18 @@ static int wm8776_input_mux_put(struct snd_kcontrol *ctl,
mutex_lock(&chip->mutex); mutex_lock(&chip->mutex);
reg = data->wm8776_regs[WM8776_ADCMUX]; reg = data->wm8776_regs[WM8776_ADCMUX];
if (value->value.integer.value[0]) { if (value->value.integer.value[0]) {
reg &= ~0x003;
reg |= mux_bit; reg |= mux_bit;
/* line-in and mic-in are exclusive */
mux_bit ^= 3;
if (reg & mux_bit) {
reg &= ~mux_bit;
if (mux_bit == 1)
other_ctl = data->line_adcmux_control;
else
other_ctl = data->mic_adcmux_control;
snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
&other_ctl->id);
}
} else } else
reg &= ~mux_bit; reg &= ~mux_bit;
changed = reg != data->wm8776_regs[WM8776_ADCMUX]; changed = reg != data->wm8776_regs[WM8776_ADCMUX];
...@@ -963,7 +977,13 @@ static int xonar_ds_mixer_init(struct oxygen *chip) ...@@ -963,7 +977,13 @@ static int xonar_ds_mixer_init(struct oxygen *chip)
err = snd_ctl_add(chip->card, ctl); err = snd_ctl_add(chip->card, ctl);
if (err < 0) if (err < 0)
return err; return err;
if (!strcmp(ctl->id.name, "Line Capture Switch"))
data->line_adcmux_control = ctl;
else if (!strcmp(ctl->id.name, "Mic Capture Switch"))
data->mic_adcmux_control = ctl;
} }
if (!data->line_adcmux_control || !data->mic_adcmux_control)
return -ENXIO;
BUILD_BUG_ON(ARRAY_SIZE(lc_controls) != ARRAY_SIZE(data->lc_controls)); BUILD_BUG_ON(ARRAY_SIZE(lc_controls) != ARRAY_SIZE(data->lc_controls));
for (i = 0; i < ARRAY_SIZE(lc_controls); ++i) { for (i = 0; i < ARRAY_SIZE(lc_controls); ++i) {
ctl = snd_ctl_new1(&lc_controls[i], chip); ctl = snd_ctl_new1(&lc_controls[i], chip);
......
...@@ -126,7 +126,7 @@ static void snd_usb_stream_disconnect(struct list_head *head) ...@@ -126,7 +126,7 @@ static void snd_usb_stream_disconnect(struct list_head *head)
for (idx = 0; idx < 2; idx++) { for (idx = 0; idx < 2; idx++) {
subs = &as->substream[idx]; subs = &as->substream[idx];
if (!subs->num_formats) if (!subs->num_formats)
return; continue;
snd_usb_release_substream_urbs(subs, 1); snd_usb_release_substream_urbs(subs, 1);
subs->interface = -1; subs->interface = -1;
} }
......
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