sound fixes for 3.20-rc1
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 -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAABCAAGBQJU5eAJAAoJEGwxgFQ9KSmkCJEP/RSEuVaDCvWOjq5Z0z2DJe9+ x+zmuaF7NYjAbLFt/ODtlv4xihkDGdiZyi1LPPH69pC57Yzx8mVGxSsjv4DRemWd W+2mjHqkRV/bt0nQjJfAGiHEGH2ZPHsB74+6nvlVk7UN2VGdcE/6JSkJ67b6e/u8 yY3DUASaSn2xXGIAso7M3gWBdCCAE6qlVyeaP6xhs/VuclqTZHvc7nzg7jh0S0KL Bfd/clFEaWy0cSoEQfxd7n+o0U+EnuXsIpL0Jg8pXgN7RMv3mBZQT8QSupd/GhNb IhkIav+xeZyvq+Bw+vV8mbOe11o71K7qNXrVpckzF2C2HaLrLqwcl/U2UcowY4/3 ktbBvxhMwXL+BP2DE/Rz9GqE0WmuaSkQtu9O+L5+cXaMjecHze814v29P6/gq9Z5 pdSGMCI64IJrvKok8Lt2Y262P9oLsD9s4cDTsiZ4ylSXkKYcoXhOGoRWsm+bVp5U dzjpwKtisk90FGJ2vYbVQHPb1G3QmKo8ibkS9RRbQohblc68HHOSXenVQ2CdrZvg N1b4klyG6q+Emqt+3SRoZ64Ue1zovN9qVeD45TadHNOmajBhOpHljSowhYbGO5tD ASxpprtPDBEsogzk/jZfMeeYJf2k0Tejlht4vJ9gtWgKekVQdcuHdnMqV8GKhNde pJC3zz9K9fUC0LQNoab1 =IYJ7 -----END PGP SIGNATURE----- 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
This commit is contained in:
Коммит
a2a6937da0
|
@ -269,6 +269,9 @@ do_control(struct snd_midi_op *ops, void *drv, struct snd_midi_channel_set *chse
|
|||
{
|
||||
int i;
|
||||
|
||||
if (control >= ARRAY_SIZE(chan->control))
|
||||
return;
|
||||
|
||||
/* Switches */
|
||||
if ((control >=64 && control <=69) || (control >= 80 && control <= 83)) {
|
||||
/* 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)
|
|||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
hda->regs = devm_ioremap_resource(dev, res);
|
||||
if (IS_ERR(chip->remap_addr))
|
||||
return PTR_ERR(chip->remap_addr);
|
||||
if (IS_ERR(hda->regs))
|
||||
return PTR_ERR(hda->regs);
|
||||
|
||||
chip->remap_addr = hda->regs + HDA_BAR0;
|
||||
chip->addr = res->start + HDA_BAR0;
|
||||
|
|
|
@ -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, 0x225f, "HP", ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY),
|
||||
/* 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, 0x2214, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
|
||||
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)
|
|||
snd_pcm_hw_constraint_minmax(runtime,
|
||||
SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
|
||||
64, 8192);
|
||||
snd_pcm_hw_constraint_minmax(runtime,
|
||||
SNDRV_PCM_HW_PARAM_PERIODS,
|
||||
2, 2);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -6156,6 +6159,9 @@ static int snd_hdspm_capture_open(struct snd_pcm_substream *substream)
|
|||
snd_pcm_hw_constraint_minmax(runtime,
|
||||
SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
|
||||
64, 8192);
|
||||
snd_pcm_hw_constraint_minmax(runtime,
|
||||
SNDRV_PCM_HW_PARAM_PERIODS,
|
||||
2, 2);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -91,7 +91,8 @@ static const struct snd_pcm_hardware hsw_pcm_hardware = {
|
|||
SNDRV_PCM_INFO_INTERLEAVED |
|
||||
SNDRV_PCM_INFO_PAUSE |
|
||||
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 |
|
||||
SNDRV_PCM_FMTBIT_S32_LE,
|
||||
.period_bytes_min = PAGE_SIZE,
|
||||
|
|
|
@ -303,6 +303,11 @@ static int set_sample_rate_v1(struct snd_usb_audio *chip, int iface,
|
|||
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,
|
||||
USB_TYPE_CLASS | USB_RECIP_ENDPOINT | USB_DIR_IN,
|
||||
UAC_EP_CS_ATTR_SAMPLE_RATE << 8, ep,
|
||||
|
|
|
@ -302,14 +302,17 @@ static void line6_data_received(struct urb *urb)
|
|||
/*
|
||||
Read data from device.
|
||||
*/
|
||||
int line6_read_data(struct usb_line6 *line6, int address, void *data,
|
||||
size_t datalen)
|
||||
int line6_read_data(struct usb_line6 *line6, unsigned address, void *data,
|
||||
unsigned datalen)
|
||||
{
|
||||
struct usb_device *usbdev = line6->usbdev;
|
||||
int ret;
|
||||
unsigned char len;
|
||||
unsigned count;
|
||||
|
||||
if (address > 0xffff || datalen > 0xff)
|
||||
return -EINVAL;
|
||||
|
||||
/* query the serial number: */
|
||||
ret = usb_control_msg(usbdev, usb_sndctrlpipe(usbdev, 0), 0x67,
|
||||
USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
|
||||
|
@ -370,14 +373,17 @@ EXPORT_SYMBOL_GPL(line6_read_data);
|
|||
/*
|
||||
Write data to device.
|
||||
*/
|
||||
int line6_write_data(struct usb_line6 *line6, int address, void *data,
|
||||
size_t datalen)
|
||||
int line6_write_data(struct usb_line6 *line6, unsigned address, void *data,
|
||||
unsigned datalen)
|
||||
{
|
||||
struct usb_device *usbdev = line6->usbdev;
|
||||
int ret;
|
||||
unsigned char status;
|
||||
int count;
|
||||
|
||||
if (address > 0xffff || datalen > 0xffff)
|
||||
return -EINVAL;
|
||||
|
||||
ret = usb_control_msg(usbdev, usb_sndctrlpipe(usbdev, 0), 0x67,
|
||||
USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
|
||||
0x0022, address, data, datalen,
|
||||
|
|
|
@ -147,8 +147,8 @@ struct usb_line6 {
|
|||
|
||||
extern char *line6_alloc_sysex_buffer(struct usb_line6 *line6, int code1,
|
||||
int code2, int size);
|
||||
extern int line6_read_data(struct usb_line6 *line6, int address, void *data,
|
||||
size_t datalen);
|
||||
extern int line6_read_data(struct usb_line6 *line6, unsigned address,
|
||||
void *data, unsigned datalen);
|
||||
extern int line6_read_serial_number(struct usb_line6 *line6,
|
||||
u32 *serial_number);
|
||||
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,
|
|||
void (*function)(unsigned long),
|
||||
unsigned long data);
|
||||
extern int line6_version_request_async(struct usb_line6 *line6);
|
||||
extern int line6_write_data(struct usb_line6 *line6, int address, void *data,
|
||||
size_t datalen);
|
||||
extern int line6_write_data(struct usb_line6 *line6, unsigned address,
|
||||
void *data, unsigned datalen);
|
||||
|
||||
int line6_probe(struct usb_interface *interface,
|
||||
const struct usb_device_id *id,
|
||||
|
|
|
@ -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
|
||||
* between PCM and native DSD mode
|
||||
|
@ -1122,6 +1127,7 @@ int snd_usb_select_mode_quirk(struct snd_usb_substream *subs,
|
|||
int err;
|
||||
|
||||
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, 0x3006): /* Marantz SA-14S1 */
|
||||
|
||||
|
@ -1201,6 +1207,7 @@ void snd_usb_ctl_msg_quirk(struct usb_device *dev, unsigned int pipe,
|
|||
(requesttype & USB_TYPE_MASK) == USB_TYPE_CLASS) {
|
||||
|
||||
switch (le16_to_cpu(dev->descriptor.idProduct)) {
|
||||
case 0x1003: /* Denon DA300-USB */
|
||||
case 0x3005: /* Marantz HD-DAC1 */
|
||||
case 0x3006: /* Marantz SA-14S1 */
|
||||
mdelay(20);
|
||||
|
@ -1262,6 +1269,7 @@ u64 snd_usb_interface_dsd_format_quirks(struct snd_usb_audio *chip,
|
|||
|
||||
/* Denon/Marantz devices with USB DAC functionality */
|
||||
switch (chip->usb_id) {
|
||||
case USB_ID(0x154e, 0x1003): /* Denon DA300-USB */
|
||||
case USB_ID(0x154e, 0x3005): /* Marantz HD-DAC1 */
|
||||
case USB_ID(0x154e, 0x3006): /* Marantz SA-14S1 */
|
||||
if (fp->altsetting == 2)
|
||||
|
|
|
@ -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,
|
||||
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,
|
||||
struct audioformat *fp);
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче