Merge branch 'for-linus' into for-next
Conflicts: sound/core/control.c
This commit is contained in:
commit
241bc82e62
|
@ -1128,7 +1128,7 @@ static int replace_user_tlv(struct snd_kcontrol *kctl, unsigned int __user *buf,
|
|||
|
||||
change = ue->tlv_data_size != size;
|
||||
if (!change)
|
||||
change = memcmp(ue->tlv_data, container, size);
|
||||
change = memcmp(ue->tlv_data, container, size) != 0;
|
||||
if (!change) {
|
||||
kfree(container);
|
||||
return 0;
|
||||
|
|
|
@ -47,10 +47,10 @@ config SND_SEQ_HRTIMER_DEFAULT
|
|||
timer.
|
||||
|
||||
config SND_SEQ_MIDI_EVENT
|
||||
def_tristate SND_RAWMIDI
|
||||
tristate
|
||||
|
||||
config SND_SEQ_MIDI
|
||||
tristate
|
||||
def_tristate SND_RAWMIDI
|
||||
select SND_SEQ_MIDI_EVENT
|
||||
|
||||
config SND_SEQ_MIDI_EMUL
|
||||
|
|
|
@ -1502,16 +1502,11 @@ static int snd_seq_ioctl_unsubscribe_port(struct snd_seq_client *client,
|
|||
static int snd_seq_ioctl_create_queue(struct snd_seq_client *client, void *arg)
|
||||
{
|
||||
struct snd_seq_queue_info *info = arg;
|
||||
int result;
|
||||
struct snd_seq_queue *q;
|
||||
|
||||
result = snd_seq_queue_alloc(client->number, info->locked, info->flags);
|
||||
if (result < 0)
|
||||
return result;
|
||||
|
||||
q = queueptr(result);
|
||||
if (q == NULL)
|
||||
return -EINVAL;
|
||||
q = snd_seq_queue_alloc(client->number, info->locked, info->flags);
|
||||
if (IS_ERR(q))
|
||||
return PTR_ERR(q);
|
||||
|
||||
info->queue = q->queue;
|
||||
info->locked = q->locked;
|
||||
|
@ -1521,7 +1516,7 @@ static int snd_seq_ioctl_create_queue(struct snd_seq_client *client, void *arg)
|
|||
if (!info->name[0])
|
||||
snprintf(info->name, sizeof(info->name), "Queue-%d", q->queue);
|
||||
strlcpy(q->name, info->name, sizeof(q->name));
|
||||
queuefree(q);
|
||||
snd_use_lock_free(&q->use_lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -184,22 +184,26 @@ void __exit snd_seq_queues_delete(void)
|
|||
static void queue_use(struct snd_seq_queue *queue, int client, int use);
|
||||
|
||||
/* allocate a new queue -
|
||||
* return queue index value or negative value for error
|
||||
* return pointer to new queue or ERR_PTR(-errno) for error
|
||||
* The new queue's use_lock is set to 1. It is the caller's responsibility to
|
||||
* call snd_use_lock_free(&q->use_lock).
|
||||
*/
|
||||
int snd_seq_queue_alloc(int client, int locked, unsigned int info_flags)
|
||||
struct snd_seq_queue *snd_seq_queue_alloc(int client, int locked, unsigned int info_flags)
|
||||
{
|
||||
struct snd_seq_queue *q;
|
||||
|
||||
q = queue_new(client, locked);
|
||||
if (q == NULL)
|
||||
return -ENOMEM;
|
||||
return ERR_PTR(-ENOMEM);
|
||||
q->info_flags = info_flags;
|
||||
queue_use(q, client, 1);
|
||||
snd_use_lock_use(&q->use_lock);
|
||||
if (queue_list_add(q) < 0) {
|
||||
snd_use_lock_free(&q->use_lock);
|
||||
queue_delete(q);
|
||||
return -ENOMEM;
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
return q->queue;
|
||||
return q;
|
||||
}
|
||||
|
||||
/* delete a queue - queue must be owned by the client */
|
||||
|
|
|
@ -71,7 +71,7 @@ void snd_seq_queues_delete(void);
|
|||
|
||||
|
||||
/* create new queue (constructor) */
|
||||
int snd_seq_queue_alloc(int client, int locked, unsigned int flags);
|
||||
struct snd_seq_queue *snd_seq_queue_alloc(int client, int locked, unsigned int flags);
|
||||
|
||||
/* delete queue (destructor) */
|
||||
int snd_seq_queue_delete(int client, int queueid);
|
||||
|
|
|
@ -210,9 +210,14 @@ EXPORT_SYMBOL(fw_iso_resources_update);
|
|||
*/
|
||||
void fw_iso_resources_free(struct fw_iso_resources *r)
|
||||
{
|
||||
struct fw_card *card = fw_parent_device(r->unit)->card;
|
||||
struct fw_card *card;
|
||||
int bandwidth, channel;
|
||||
|
||||
/* Not initialized. */
|
||||
if (r->unit == NULL)
|
||||
return;
|
||||
card = fw_parent_device(r->unit)->card;
|
||||
|
||||
mutex_lock(&r->mutex);
|
||||
|
||||
if (r->allocated) {
|
||||
|
|
|
@ -131,6 +131,7 @@ static void do_registration(struct work_struct *work)
|
|||
return;
|
||||
error:
|
||||
snd_motu_transaction_unregister(motu);
|
||||
snd_motu_stream_destroy_duplex(motu);
|
||||
snd_card_free(motu->card);
|
||||
dev_info(&motu->unit->device,
|
||||
"Sound card registration failed: %d\n", err);
|
||||
|
|
|
@ -698,10 +698,18 @@ static int copy_gctl(struct snd_emu10k1 *emu,
|
|||
{
|
||||
struct snd_emu10k1_fx8010_control_old_gpr __user *octl;
|
||||
|
||||
if (emu->support_tlv)
|
||||
return copy_from_user(gctl, &_gctl[idx], sizeof(*gctl));
|
||||
if (emu->support_tlv) {
|
||||
if (in_kernel)
|
||||
memcpy(gctl, (void *)&_gctl[idx], sizeof(*gctl));
|
||||
else if (copy_from_user(gctl, &_gctl[idx], sizeof(*gctl)))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
}
|
||||
|
||||
octl = (struct snd_emu10k1_fx8010_control_old_gpr __user *)_gctl;
|
||||
if (copy_from_user(gctl, &octl[idx], sizeof(*octl)))
|
||||
if (in_kernel)
|
||||
memcpy(gctl, (void *)&octl[idx], sizeof(*octl));
|
||||
else if (copy_from_user(gctl, &octl[idx], sizeof(*octl)))
|
||||
return -EFAULT;
|
||||
gctl->tlv = NULL;
|
||||
return 0;
|
||||
|
|
|
@ -6647,7 +6647,6 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
|
|||
SND_HDA_PIN_QUIRK(0x10ec0299, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
|
||||
ALC225_STANDARD_PINS,
|
||||
{0x12, 0xb7a60130},
|
||||
{0x13, 0xb8a61140},
|
||||
{0x17, 0x90170110}),
|
||||
{}
|
||||
};
|
||||
|
|
|
@ -548,6 +548,8 @@ int snd_usb_mixer_vol_tlv(struct snd_kcontrol *kcontrol, int op_flag,
|
|||
|
||||
if (size < sizeof(scale))
|
||||
return -ENOMEM;
|
||||
if (cval->min_mute)
|
||||
scale[0] = SNDRV_CTL_TLVT_DB_MINMAX_MUTE;
|
||||
scale[2] = cval->dBmin;
|
||||
scale[3] = cval->dBmax;
|
||||
if (copy_to_user(_tlv, scale, sizeof(scale)))
|
||||
|
|
|
@ -64,6 +64,7 @@ struct usb_mixer_elem_info {
|
|||
int cached;
|
||||
int cache_val[MAX_CHANNELS];
|
||||
u8 initialized;
|
||||
u8 min_mute;
|
||||
void *private_data;
|
||||
};
|
||||
|
||||
|
|
|
@ -1878,6 +1878,12 @@ void snd_usb_mixer_fu_apply_quirk(struct usb_mixer_interface *mixer,
|
|||
if (unitid == 7 && cval->control == UAC_FU_VOLUME)
|
||||
snd_dragonfly_quirk_db_scale(mixer, cval, kctl);
|
||||
break;
|
||||
/* lowest playback value is muted on C-Media devices */
|
||||
case USB_ID(0x0d8c, 0x000c):
|
||||
case USB_ID(0x0d8c, 0x0014):
|
||||
if (strstr(kctl->id.name, "Playback"))
|
||||
cval->min_mute = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1141,6 +1141,7 @@ bool snd_usb_get_sample_rate_quirk(struct snd_usb_audio *chip)
|
|||
case USB_ID(0x0556, 0x0014): /* Phoenix Audio TMX320VC */
|
||||
case USB_ID(0x05A3, 0x9420): /* ELP HD USB Camera */
|
||||
case USB_ID(0x074D, 0x3553): /* Outlaw RR2150 (Micronas UAC3553B) */
|
||||
case USB_ID(0x1395, 0x740a): /* Sennheiser DECT */
|
||||
case USB_ID(0x1901, 0x0191): /* GE B850V3 CP2114 audio interface */
|
||||
case USB_ID(0x1de7, 0x0013): /* Phoenix Audio MT202exe */
|
||||
case USB_ID(0x1de7, 0x0014): /* Phoenix Audio TMX320 */
|
||||
|
@ -1307,10 +1308,13 @@ void snd_usb_ctl_msg_quirk(struct usb_device *dev, unsigned int pipe,
|
|||
&& (requesttype & USB_TYPE_MASK) == USB_TYPE_CLASS)
|
||||
mdelay(20);
|
||||
|
||||
/* Zoom R16/24 needs a tiny delay here, otherwise requests like
|
||||
* get/set frequency return as failed despite actually succeeding.
|
||||
/* Zoom R16/24, Logitech H650e, Jabra 550a needs a tiny delay here,
|
||||
* otherwise requests like get/set frequency return as failed despite
|
||||
* actually succeeding.
|
||||
*/
|
||||
if (chip->usb_id == USB_ID(0x1686, 0x00dd) &&
|
||||
if ((chip->usb_id == USB_ID(0x1686, 0x00dd) ||
|
||||
chip->usb_id == USB_ID(0x046d, 0x0a46) ||
|
||||
chip->usb_id == USB_ID(0x0b0e, 0x0349)) &&
|
||||
(requesttype & USB_TYPE_MASK) == USB_TYPE_CLASS)
|
||||
mdelay(1);
|
||||
}
|
||||
|
@ -1373,6 +1377,10 @@ u64 snd_usb_interface_dsd_format_quirks(struct snd_usb_audio *chip,
|
|||
}
|
||||
}
|
||||
break;
|
||||
case USB_ID(0x16d0, 0x0a23):
|
||||
if (fp->altsetting == 2)
|
||||
return SNDRV_PCM_FMTBIT_DSD_U32_BE;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
|
|
Loading…
Reference in New Issue