Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 210501
b: refs/heads/master
c: 5431427
h: refs/heads/master
i:
  210499: c48acba
v: v3
  • Loading branch information
Takashi Iwai committed Sep 10, 2010
1 parent 4d8f15f commit a7c2da2
Show file tree
Hide file tree
Showing 14 changed files with 94 additions and 40 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 122661b67899980f1372812d907e73ebcfb3d037
refs/heads/master: 5431427b1a5acbae0b3dffd91f6ba96aee141f43
2 changes: 2 additions & 0 deletions trunk/sound/core/rawmidi.c
Original file line number Diff line number Diff line change
Expand Up @@ -829,6 +829,8 @@ static int snd_rawmidi_control_ioctl(struct snd_card *card,

if (get_user(device, (int __user *)argp))
return -EFAULT;
if (device >= SNDRV_RAWMIDI_DEVICES) /* next device is -1 */
device = SNDRV_RAWMIDI_DEVICES - 1;
mutex_lock(&register_mutex);
device = device < 0 ? 0 : device + 1;
while (device < SNDRV_RAWMIDI_DEVICES) {
Expand Down
9 changes: 4 additions & 5 deletions trunk/sound/core/seq/oss/seq_oss_init.c
Original file line number Diff line number Diff line change
Expand Up @@ -281,13 +281,10 @@ snd_seq_oss_open(struct file *file, int level)
return 0;

_error:
snd_seq_oss_writeq_delete(dp->writeq);
snd_seq_oss_readq_delete(dp->readq);
snd_seq_oss_synth_cleanup(dp);
snd_seq_oss_midi_cleanup(dp);
delete_port(dp);
delete_seq_queue(dp->queue);
kfree(dp);
delete_port(dp);

return rc;
}
Expand Down Expand Up @@ -350,8 +347,10 @@ create_port(struct seq_oss_devinfo *dp)
static int
delete_port(struct seq_oss_devinfo *dp)
{
if (dp->port < 0)
if (dp->port < 0) {
kfree(dp);
return 0;
}

debug_printk(("delete_port %i\n", dp->port));
return snd_seq_event_port_detach(dp->cseq, dp->port);
Expand Down
8 changes: 6 additions & 2 deletions trunk/sound/isa/msnd/msnd_pinnacle.c
Original file line number Diff line number Diff line change
Expand Up @@ -764,9 +764,9 @@ static long io[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
static int irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ;
static long mem[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;

#ifndef MSND_CLASSIC
static long cfg[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;

#ifndef MSND_CLASSIC
/* Extra Peripheral Configuration (Default: Disable) */
static long ide_io0[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
static long ide_io1[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
Expand Down Expand Up @@ -894,7 +894,11 @@ static int __devinit snd_msnd_isa_probe(struct device *pdev, unsigned int idx)
struct snd_card *card;
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");
return -ENODEV;
}
Expand Down
1 change: 1 addition & 0 deletions trunk/sound/pci/oxygen/oxygen.h
Original file line number Diff line number Diff line change
Expand Up @@ -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_resume(struct pci_dev *pci);
#endif
void oxygen_pci_shutdown(struct pci_dev *pci);

/* oxygen_mixer.c */

Expand Down
21 changes: 18 additions & 3 deletions trunk/sound/pci/oxygen/oxygen_lib.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
chip->interrupt_mask = 0;
chip->pcm_running = 0;
oxygen_write16(chip, OXYGEN_DMA_STATUS, 0);
oxygen_write16(chip, OXYGEN_INTERRUPT_MASK, 0);
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)
free_irq(chip->irq, chip);
flush_scheduled_work();
Expand Down Expand Up @@ -778,3 +783,13 @@ int oxygen_pci_resume(struct pci_dev *pci)
}
EXPORT_SYMBOL(oxygen_pci_resume);
#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);
1 change: 1 addition & 0 deletions trunk/sound/pci/oxygen/virtuoso.c
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ static struct pci_driver xonar_driver = {
.suspend = oxygen_pci_suspend,
.resume = oxygen_pci_resume,
#endif
.shutdown = oxygen_pci_shutdown,
};

static int __init alsa_card_xonar_init(void)
Expand Down
22 changes: 21 additions & 1 deletion trunk/sound/pci/oxygen/xonar_wm87x6.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ struct xonar_wm87x6 {
struct xonar_generic generic;
u16 wm8776_regs[0x17];
u16 wm8766_regs[0x10];
struct snd_kcontrol *line_adcmux_control;
struct snd_kcontrol *mic_adcmux_control;
struct snd_kcontrol *lc_controls[13];
};

Expand Down Expand Up @@ -193,6 +195,7 @@ static void xonar_ds_init(struct oxygen *chip)
static void xonar_ds_cleanup(struct oxygen *chip)
{
xonar_disable_output(chip);
wm8776_write(chip, WM8776_RESET, 0);
}

static void xonar_ds_suspend(struct oxygen *chip)
Expand Down Expand Up @@ -603,15 +606,26 @@ static int wm8776_input_mux_put(struct snd_kcontrol *ctl,
{
struct oxygen *chip = ctl->private_data;
struct xonar_wm87x6 *data = chip->model_data;
struct snd_kcontrol *other_ctl;
unsigned int mux_bit = ctl->private_value;
u16 reg;
int changed;

mutex_lock(&chip->mutex);
reg = data->wm8776_regs[WM8776_ADCMUX];
if (value->value.integer.value[0]) {
reg &= ~0x003;
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
reg &= ~mux_bit;
changed = reg != data->wm8776_regs[WM8776_ADCMUX];
Expand Down Expand Up @@ -963,7 +977,13 @@ static int xonar_ds_mixer_init(struct oxygen *chip)
err = snd_ctl_add(chip->card, ctl);
if (err < 0)
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));
for (i = 0; i < ARRAY_SIZE(lc_controls); ++i) {
ctl = snd_ctl_new1(&lc_controls[i], chip);
Expand Down
19 changes: 13 additions & 6 deletions trunk/sound/usb/card.c
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ static void snd_usb_stream_disconnect(struct list_head *head)
for (idx = 0; idx < 2; idx++) {
subs = &as->substream[idx];
if (!subs->num_formats)
return;
continue;
snd_usb_release_substream_urbs(subs, 1);
subs->interface = -1;
}
Expand Down Expand Up @@ -216,6 +216,11 @@ static int snd_usb_create_streams(struct snd_usb_audio *chip, int ctrlif)
}

switch (protocol) {
default:
snd_printdd(KERN_WARNING "unknown interface protocol %#02x, assuming v1\n",
protocol);
/* fall through */

case UAC_VERSION_1: {
struct uac1_ac_header_descriptor *h1 = control_header;

Expand Down Expand Up @@ -253,10 +258,6 @@ static int snd_usb_create_streams(struct snd_usb_audio *chip, int ctrlif)

break;
}

default:
snd_printk(KERN_ERR "unknown protocol version 0x%02x\n", protocol);
return -EINVAL;
}

return 0;
Expand Down Expand Up @@ -465,7 +466,13 @@ static void *snd_usb_audio_probe(struct usb_device *dev,
goto __error;
}

chip->ctrl_intf = alts;
/*
* For devices with more than one control interface, we assume the
* first contains the audio controls. We might need a more specific
* check here in the future.
*/
if (!chip->ctrl_intf)
chip->ctrl_intf = alts;

if (err > 0) {
/* create normal USB audio interfaces */
Expand Down
3 changes: 1 addition & 2 deletions trunk/sound/usb/clock.c
Original file line number Diff line number Diff line change
Expand Up @@ -295,12 +295,11 @@ int snd_usb_init_sample_rate(struct snd_usb_audio *chip, int iface,

switch (altsd->bInterfaceProtocol) {
case UAC_VERSION_1:
default:
return set_sample_rate_v1(chip, iface, alts, fmt, rate);

case UAC_VERSION_2:
return set_sample_rate_v2(chip, iface, alts, fmt, rate);
}

return -EINVAL;
}

11 changes: 6 additions & 5 deletions trunk/sound/usb/endpoint.c
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,12 @@ int snd_usb_parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no)

/* get audio formats */
switch (protocol) {
default:
snd_printdd(KERN_WARNING "%d:%u:%d: unknown interface protocol %#02x, assuming v1\n",
dev->devnum, iface_no, altno, protocol);
protocol = UAC_VERSION_1;
/* fall through */

case UAC_VERSION_1: {
struct uac1_as_header_descriptor *as =
snd_usb_find_csint_desc(alts->extra, alts->extralen, NULL, UAC_AS_GENERAL);
Expand Down Expand Up @@ -336,11 +342,6 @@ int snd_usb_parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no)
dev->devnum, iface_no, altno, as->bTerminalLink);
continue;
}

default:
snd_printk(KERN_ERR "%d:%u:%d : unknown interface protocol %04x\n",
dev->devnum, iface_no, altno, protocol);
continue;
}

/* get format type */
Expand Down
22 changes: 10 additions & 12 deletions trunk/sound/usb/format.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,8 @@ static u64 parse_audio_format_i_type(struct snd_usb_audio *chip,
u64 pcm_formats;

switch (protocol) {
case UAC_VERSION_1: {
case UAC_VERSION_1:
default: {
struct uac_format_type_i_discrete_descriptor *fmt = _fmt;
sample_width = fmt->bBitResolution;
sample_bytes = fmt->bSubframeSize;
Expand All @@ -64,9 +65,6 @@ static u64 parse_audio_format_i_type(struct snd_usb_audio *chip,
format <<= 1;
break;
}

default:
return -EINVAL;
}

pcm_formats = 0;
Expand Down Expand Up @@ -384,6 +382,10 @@ static int parse_audio_format_i(struct snd_usb_audio *chip,
* audio class v2 uses class specific EP0 range requests for that.
*/
switch (protocol) {
default:
snd_printdd(KERN_WARNING "%d:%u:%d : invalid protocol version %d, assuming v1\n",
chip->dev->devnum, fp->iface, fp->altsetting, protocol);
/* fall through */
case UAC_VERSION_1:
fp->channels = fmt->bNrChannels;
ret = parse_audio_format_rates_v1(chip, fp, (unsigned char *) fmt, 7);
Expand All @@ -392,10 +394,6 @@ static int parse_audio_format_i(struct snd_usb_audio *chip,
/* fp->channels is already set in this case */
ret = parse_audio_format_rates_v2(chip, fp);
break;
default:
snd_printk(KERN_ERR "%d:%u:%d : invalid protocol version %d\n",
chip->dev->devnum, fp->iface, fp->altsetting, protocol);
return -EINVAL;
}

if (fp->channels < 1) {
Expand Down Expand Up @@ -438,6 +436,10 @@ static int parse_audio_format_ii(struct snd_usb_audio *chip,
fp->channels = 1;

switch (protocol) {
default:
snd_printdd(KERN_WARNING "%d:%u:%d : invalid protocol version %d, assuming v1\n",
chip->dev->devnum, fp->iface, fp->altsetting, protocol);
/* fall through */
case UAC_VERSION_1: {
struct uac_format_type_ii_discrete_descriptor *fmt = _fmt;
brate = le16_to_cpu(fmt->wMaxBitRate);
Expand All @@ -456,10 +458,6 @@ static int parse_audio_format_ii(struct snd_usb_audio *chip,
ret = parse_audio_format_rates_v2(chip, fp);
break;
}
default:
snd_printk(KERN_ERR "%d:%u:%d : invalid protocol version %d\n",
chip->dev->devnum, fp->iface, fp->altsetting, protocol);
return -EINVAL;
}

return ret;
Expand Down
10 changes: 9 additions & 1 deletion trunk/sound/usb/mixer.c
Original file line number Diff line number Diff line change
Expand Up @@ -2175,7 +2175,15 @@ int snd_usb_create_mixer(struct snd_usb_audio *chip, int ctrlif,
}

host_iface = &usb_ifnum_to_if(chip->dev, ctrlif)->altsetting[0];
mixer->protocol = get_iface_desc(host_iface)->bInterfaceProtocol;
switch (get_iface_desc(host_iface)->bInterfaceProtocol) {
case UAC_VERSION_1:
default:
mixer->protocol = UAC_VERSION_1;
break;
case UAC_VERSION_2:
mixer->protocol = UAC_VERSION_2;
break;
}

if ((err = snd_usb_mixer_controls(mixer)) < 0 ||
(err = snd_usb_mixer_status_create(mixer)) < 0)
Expand Down
3 changes: 1 addition & 2 deletions trunk/sound/usb/pcm.c
Original file line number Diff line number Diff line change
Expand Up @@ -173,13 +173,12 @@ int snd_usb_init_pitch(struct snd_usb_audio *chip, int iface,

switch (altsd->bInterfaceProtocol) {
case UAC_VERSION_1:
default:
return init_pitch_v1(chip, iface, alts, fmt);

case UAC_VERSION_2:
return init_pitch_v2(chip, iface, alts, fmt);
}

return -EINVAL;
}

/*
Expand Down

0 comments on commit a7c2da2

Please sign in to comment.