Commit a2a6937d authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'sound-fix-3.20-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound

Pull sound fixes from Takashi Iwai:
 "Here are a few small fix patches for 3.20-rc1:

   - Quirks for Denon and Lifecam USB-audio devices and HD-audio on HP
     laptops
   - A long-time regression fix for HDSP eMADI
   - Add missing DRAIN_TRIGGER flag set for ASoC intel-sst
   - Trivial fixes for sequencer core and HD-audio Tegra, a LINE6
     cleanup"

* tag 'sound-fix-3.20-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound:
  ALSA: usb: Fix support for Denon DA-300USB DAC (ID 154e:1003)
  ASoC: Intel: add SNDRV_PCM_INFO_DRAIN_TRIGGER flag
  ALSA: usb-audio: Don't attempt to get Lifecam HD-5000 sample rate
  ALSA: hda/tegra check correct return value from ioremap_resource
  ALSA: hdspm - Constrain periods to 2 on older cards
  ALSA: hda - enable mute led quirk for one more hp machine.
  ALSA: seq: potential out of bounds in do_control()
  ALSA: line6: Improve line6_read/write_data() interfaces
parents f5e25f0d 3cd1ce04
...@@ -269,6 +269,9 @@ do_control(struct snd_midi_op *ops, void *drv, struct snd_midi_channel_set *chse ...@@ -269,6 +269,9 @@ do_control(struct snd_midi_op *ops, void *drv, struct snd_midi_channel_set *chse
{ {
int i; int i;
if (control >= ARRAY_SIZE(chan->control))
return;
/* Switches */ /* Switches */
if ((control >=64 && control <=69) || (control >= 80 && control <= 83)) { if ((control >=64 && control <=69) || (control >= 80 && control <= 83)) {
/* These are all switches; either off or on so set to 0 or 127 */ /* These are all switches; either off or on so set to 0 or 127 */
......
...@@ -329,8 +329,8 @@ static int hda_tegra_init_chip(struct azx *chip, struct platform_device *pdev) ...@@ -329,8 +329,8 @@ static int hda_tegra_init_chip(struct azx *chip, struct platform_device *pdev)
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
hda->regs = devm_ioremap_resource(dev, res); hda->regs = devm_ioremap_resource(dev, res);
if (IS_ERR(chip->remap_addr)) if (IS_ERR(hda->regs))
return PTR_ERR(chip->remap_addr); return PTR_ERR(hda->regs);
chip->remap_addr = hda->regs + HDA_BAR0; chip->remap_addr = hda->regs + HDA_BAR0;
chip->addr = res->start + HDA_BAR0; chip->addr = res->start + HDA_BAR0;
......
...@@ -4937,6 +4937,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { ...@@ -4937,6 +4937,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
SND_PCI_QUIRK(0x103c, 0x218b, "HP", ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED), SND_PCI_QUIRK(0x103c, 0x218b, "HP", ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED),
SND_PCI_QUIRK(0x103c, 0x225f, "HP", ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY), SND_PCI_QUIRK(0x103c, 0x225f, "HP", ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY),
/* ALC282 */ /* ALC282 */
SND_PCI_QUIRK(0x103c, 0x21f9, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
SND_PCI_QUIRK(0x103c, 0x2210, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), SND_PCI_QUIRK(0x103c, 0x2210, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
SND_PCI_QUIRK(0x103c, 0x2214, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), SND_PCI_QUIRK(0x103c, 0x2214, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
SND_PCI_QUIRK(0x103c, 0x2236, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED), SND_PCI_QUIRK(0x103c, 0x2236, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
......
...@@ -6082,6 +6082,9 @@ static int snd_hdspm_playback_open(struct snd_pcm_substream *substream) ...@@ -6082,6 +6082,9 @@ static int snd_hdspm_playback_open(struct snd_pcm_substream *substream)
snd_pcm_hw_constraint_minmax(runtime, snd_pcm_hw_constraint_minmax(runtime,
SNDRV_PCM_HW_PARAM_PERIOD_SIZE, SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
64, 8192); 64, 8192);
snd_pcm_hw_constraint_minmax(runtime,
SNDRV_PCM_HW_PARAM_PERIODS,
2, 2);
break; break;
} }
...@@ -6156,6 +6159,9 @@ static int snd_hdspm_capture_open(struct snd_pcm_substream *substream) ...@@ -6156,6 +6159,9 @@ static int snd_hdspm_capture_open(struct snd_pcm_substream *substream)
snd_pcm_hw_constraint_minmax(runtime, snd_pcm_hw_constraint_minmax(runtime,
SNDRV_PCM_HW_PARAM_PERIOD_SIZE, SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
64, 8192); 64, 8192);
snd_pcm_hw_constraint_minmax(runtime,
SNDRV_PCM_HW_PARAM_PERIODS,
2, 2);
break; break;
} }
......
...@@ -91,7 +91,8 @@ static const struct snd_pcm_hardware hsw_pcm_hardware = { ...@@ -91,7 +91,8 @@ static const struct snd_pcm_hardware hsw_pcm_hardware = {
SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_INTERLEAVED |
SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_PAUSE |
SNDRV_PCM_INFO_RESUME | SNDRV_PCM_INFO_RESUME |
SNDRV_PCM_INFO_NO_PERIOD_WAKEUP, SNDRV_PCM_INFO_NO_PERIOD_WAKEUP |
SNDRV_PCM_INFO_DRAIN_TRIGGER,
.formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE | .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE |
SNDRV_PCM_FMTBIT_S32_LE, SNDRV_PCM_FMTBIT_S32_LE,
.period_bytes_min = PAGE_SIZE, .period_bytes_min = PAGE_SIZE,
......
...@@ -303,6 +303,11 @@ static int set_sample_rate_v1(struct snd_usb_audio *chip, int iface, ...@@ -303,6 +303,11 @@ static int set_sample_rate_v1(struct snd_usb_audio *chip, int iface,
return err; return err;
} }
/* Don't check the sample rate for devices which we know don't
* support reading */
if (snd_usb_get_sample_rate_quirk(chip))
return 0;
if ((err = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC_GET_CUR, if ((err = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC_GET_CUR,
USB_TYPE_CLASS | USB_RECIP_ENDPOINT | USB_DIR_IN, USB_TYPE_CLASS | USB_RECIP_ENDPOINT | USB_DIR_IN,
UAC_EP_CS_ATTR_SAMPLE_RATE << 8, ep, UAC_EP_CS_ATTR_SAMPLE_RATE << 8, ep,
......
...@@ -302,14 +302,17 @@ static void line6_data_received(struct urb *urb) ...@@ -302,14 +302,17 @@ static void line6_data_received(struct urb *urb)
/* /*
Read data from device. Read data from device.
*/ */
int line6_read_data(struct usb_line6 *line6, int address, void *data, int line6_read_data(struct usb_line6 *line6, unsigned address, void *data,
size_t datalen) unsigned datalen)
{ {
struct usb_device *usbdev = line6->usbdev; struct usb_device *usbdev = line6->usbdev;
int ret; int ret;
unsigned char len; unsigned char len;
unsigned count; unsigned count;
if (address > 0xffff || datalen > 0xff)
return -EINVAL;
/* query the serial number: */ /* query the serial number: */
ret = usb_control_msg(usbdev, usb_sndctrlpipe(usbdev, 0), 0x67, ret = usb_control_msg(usbdev, usb_sndctrlpipe(usbdev, 0), 0x67,
USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
...@@ -370,14 +373,17 @@ EXPORT_SYMBOL_GPL(line6_read_data); ...@@ -370,14 +373,17 @@ EXPORT_SYMBOL_GPL(line6_read_data);
/* /*
Write data to device. Write data to device.
*/ */
int line6_write_data(struct usb_line6 *line6, int address, void *data, int line6_write_data(struct usb_line6 *line6, unsigned address, void *data,
size_t datalen) unsigned datalen)
{ {
struct usb_device *usbdev = line6->usbdev; struct usb_device *usbdev = line6->usbdev;
int ret; int ret;
unsigned char status; unsigned char status;
int count; int count;
if (address > 0xffff || datalen > 0xffff)
return -EINVAL;
ret = usb_control_msg(usbdev, usb_sndctrlpipe(usbdev, 0), 0x67, ret = usb_control_msg(usbdev, usb_sndctrlpipe(usbdev, 0), 0x67,
USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
0x0022, address, data, datalen, 0x0022, address, data, datalen,
......
...@@ -147,8 +147,8 @@ struct usb_line6 { ...@@ -147,8 +147,8 @@ struct usb_line6 {
extern char *line6_alloc_sysex_buffer(struct usb_line6 *line6, int code1, extern char *line6_alloc_sysex_buffer(struct usb_line6 *line6, int code1,
int code2, int size); int code2, int size);
extern int line6_read_data(struct usb_line6 *line6, int address, void *data, extern int line6_read_data(struct usb_line6 *line6, unsigned address,
size_t datalen); void *data, unsigned datalen);
extern int line6_read_serial_number(struct usb_line6 *line6, extern int line6_read_serial_number(struct usb_line6 *line6,
u32 *serial_number); u32 *serial_number);
extern int line6_send_raw_message_async(struct usb_line6 *line6, extern int line6_send_raw_message_async(struct usb_line6 *line6,
...@@ -161,8 +161,8 @@ extern void line6_start_timer(struct timer_list *timer, unsigned long msecs, ...@@ -161,8 +161,8 @@ extern void line6_start_timer(struct timer_list *timer, unsigned long msecs,
void (*function)(unsigned long), void (*function)(unsigned long),
unsigned long data); unsigned long data);
extern int line6_version_request_async(struct usb_line6 *line6); extern int line6_version_request_async(struct usb_line6 *line6);
extern int line6_write_data(struct usb_line6 *line6, int address, void *data, extern int line6_write_data(struct usb_line6 *line6, unsigned address,
size_t datalen); void *data, unsigned datalen);
int line6_probe(struct usb_interface *interface, int line6_probe(struct usb_interface *interface,
const struct usb_device_id *id, const struct usb_device_id *id,
......
...@@ -1111,6 +1111,11 @@ void snd_usb_set_format_quirk(struct snd_usb_substream *subs, ...@@ -1111,6 +1111,11 @@ void snd_usb_set_format_quirk(struct snd_usb_substream *subs,
} }
} }
bool snd_usb_get_sample_rate_quirk(struct snd_usb_audio *chip)
{
/* MS Lifecam HD-5000 doesn't support reading the sample rate. */
return chip->usb_id == USB_ID(0x045E, 0x076D);
}
/* Marantz/Denon USB DACs need a vendor cmd to switch /* Marantz/Denon USB DACs need a vendor cmd to switch
* between PCM and native DSD mode * between PCM and native DSD mode
...@@ -1122,6 +1127,7 @@ int snd_usb_select_mode_quirk(struct snd_usb_substream *subs, ...@@ -1122,6 +1127,7 @@ int snd_usb_select_mode_quirk(struct snd_usb_substream *subs,
int err; int err;
switch (subs->stream->chip->usb_id) { switch (subs->stream->chip->usb_id) {
case USB_ID(0x154e, 0x1003): /* Denon DA-300USB */
case USB_ID(0x154e, 0x3005): /* Marantz HD-DAC1 */ case USB_ID(0x154e, 0x3005): /* Marantz HD-DAC1 */
case USB_ID(0x154e, 0x3006): /* Marantz SA-14S1 */ case USB_ID(0x154e, 0x3006): /* Marantz SA-14S1 */
...@@ -1201,6 +1207,7 @@ void snd_usb_ctl_msg_quirk(struct usb_device *dev, unsigned int pipe, ...@@ -1201,6 +1207,7 @@ void snd_usb_ctl_msg_quirk(struct usb_device *dev, unsigned int pipe,
(requesttype & USB_TYPE_MASK) == USB_TYPE_CLASS) { (requesttype & USB_TYPE_MASK) == USB_TYPE_CLASS) {
switch (le16_to_cpu(dev->descriptor.idProduct)) { switch (le16_to_cpu(dev->descriptor.idProduct)) {
case 0x1003: /* Denon DA300-USB */
case 0x3005: /* Marantz HD-DAC1 */ case 0x3005: /* Marantz HD-DAC1 */
case 0x3006: /* Marantz SA-14S1 */ case 0x3006: /* Marantz SA-14S1 */
mdelay(20); mdelay(20);
...@@ -1262,6 +1269,7 @@ u64 snd_usb_interface_dsd_format_quirks(struct snd_usb_audio *chip, ...@@ -1262,6 +1269,7 @@ u64 snd_usb_interface_dsd_format_quirks(struct snd_usb_audio *chip,
/* Denon/Marantz devices with USB DAC functionality */ /* Denon/Marantz devices with USB DAC functionality */
switch (chip->usb_id) { switch (chip->usb_id) {
case USB_ID(0x154e, 0x1003): /* Denon DA300-USB */
case USB_ID(0x154e, 0x3005): /* Marantz HD-DAC1 */ case USB_ID(0x154e, 0x3005): /* Marantz HD-DAC1 */
case USB_ID(0x154e, 0x3006): /* Marantz SA-14S1 */ case USB_ID(0x154e, 0x3006): /* Marantz SA-14S1 */
if (fp->altsetting == 2) if (fp->altsetting == 2)
......
...@@ -21,6 +21,8 @@ int snd_usb_apply_boot_quirk(struct usb_device *dev, ...@@ -21,6 +21,8 @@ int snd_usb_apply_boot_quirk(struct usb_device *dev,
void snd_usb_set_format_quirk(struct snd_usb_substream *subs, void snd_usb_set_format_quirk(struct snd_usb_substream *subs,
struct audioformat *fmt); struct audioformat *fmt);
bool snd_usb_get_sample_rate_quirk(struct snd_usb_audio *chip);
int snd_usb_is_big_endian_format(struct snd_usb_audio *chip, int snd_usb_is_big_endian_format(struct snd_usb_audio *chip,
struct audioformat *fp); struct audioformat *fp);
......
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