Commit b5454432 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'sound-4.5-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound

Pull sound fixes from Takashi Iwai:
 "There are a few fixes in ALSA core for bugs that have been spotted by
  fuzzer.  Also a temporary workaround for PowerPC (and possibly other)
  builds with incompatible ioctls was applied to compress API.

  Other than that, a few trivial fixes and quirks for FireWire BeBoB,
  USB-audio and HD-audio are found, too"

* tag 'sound-4.5-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound:
  ALSA: hda - disable dynamic clock gating on Broxton before reset
  ALSA: hda - Add new GPU codec ID 0x10de0083 to snd-hda
  ALSA: dummy: Disable switching timer backend via sysfs
  ALSA: timer: fix SND_PCM_TIMER Kconfig text
  ALSA: Add missing dependency on CONFIG_SND_TIMER
  ALSA: bebob: Use a signed return type for get_formation_index
  ALSA: usb-audio: Fix TEAC UD-501/UD-503/NT-503 usb delay
  ALSA: compress: Disable GET_CODEC_CAPS ioctl for some architectures
  ALSA: seq: Degrade the error message for too many opens
  ALSA: seq: Fix incorrect sanity check at snd_seq_oss_synth_cleanup()
parents b943d0b9 6639484d
...@@ -97,11 +97,11 @@ config SND_PCM_TIMER ...@@ -97,11 +97,11 @@ config SND_PCM_TIMER
bool "PCM timer interface" if EXPERT bool "PCM timer interface" if EXPERT
default y default y
help help
If you disable this option, pcm timer will be inavailable, so If you disable this option, pcm timer will be unavailable, so
those stubs used pcm timer (e.g. dmix, dsnoop & co) may work those stubs that use pcm timer (e.g. dmix, dsnoop & co) may work
incorrectlly. incorrectlly.
For some embedded device, we may disable it to reduce memory For some embedded devices, we may disable it to reduce memory
footprint, about 20KB on x86_64 platform. footprint, about 20KB on x86_64 platform.
config SND_SEQUENCER_OSS config SND_SEQUENCER_OSS
......
...@@ -46,6 +46,13 @@ ...@@ -46,6 +46,13 @@
#include <sound/compress_offload.h> #include <sound/compress_offload.h>
#include <sound/compress_driver.h> #include <sound/compress_driver.h>
/* struct snd_compr_codec_caps overflows the ioctl bit size for some
* architectures, so we need to disable the relevant ioctls.
*/
#if _IOC_SIZEBITS < 14
#define COMPR_CODEC_CAPS_OVERFLOW
#endif
/* TODO: /* TODO:
* - add substream support for multiple devices in case of * - add substream support for multiple devices in case of
* SND_DYNAMIC_MINORS is not used * SND_DYNAMIC_MINORS is not used
...@@ -440,6 +447,7 @@ snd_compr_get_caps(struct snd_compr_stream *stream, unsigned long arg) ...@@ -440,6 +447,7 @@ snd_compr_get_caps(struct snd_compr_stream *stream, unsigned long arg)
return retval; return retval;
} }
#ifndef COMPR_CODEC_CAPS_OVERFLOW
static int static int
snd_compr_get_codec_caps(struct snd_compr_stream *stream, unsigned long arg) snd_compr_get_codec_caps(struct snd_compr_stream *stream, unsigned long arg)
{ {
...@@ -463,6 +471,7 @@ snd_compr_get_codec_caps(struct snd_compr_stream *stream, unsigned long arg) ...@@ -463,6 +471,7 @@ snd_compr_get_codec_caps(struct snd_compr_stream *stream, unsigned long arg)
kfree(caps); kfree(caps);
return retval; return retval;
} }
#endif /* !COMPR_CODEC_CAPS_OVERFLOW */
/* revisit this with snd_pcm_preallocate_xxx */ /* revisit this with snd_pcm_preallocate_xxx */
static int snd_compr_allocate_buffer(struct snd_compr_stream *stream, static int snd_compr_allocate_buffer(struct snd_compr_stream *stream,
...@@ -801,9 +810,11 @@ static long snd_compr_ioctl(struct file *f, unsigned int cmd, unsigned long arg) ...@@ -801,9 +810,11 @@ static long snd_compr_ioctl(struct file *f, unsigned int cmd, unsigned long arg)
case _IOC_NR(SNDRV_COMPRESS_GET_CAPS): case _IOC_NR(SNDRV_COMPRESS_GET_CAPS):
retval = snd_compr_get_caps(stream, arg); retval = snd_compr_get_caps(stream, arg);
break; break;
#ifndef COMPR_CODEC_CAPS_OVERFLOW
case _IOC_NR(SNDRV_COMPRESS_GET_CODEC_CAPS): case _IOC_NR(SNDRV_COMPRESS_GET_CODEC_CAPS):
retval = snd_compr_get_codec_caps(stream, arg); retval = snd_compr_get_codec_caps(stream, arg);
break; break;
#endif
case _IOC_NR(SNDRV_COMPRESS_SET_PARAMS): case _IOC_NR(SNDRV_COMPRESS_SET_PARAMS):
retval = snd_compr_set_params(stream, arg); retval = snd_compr_set_params(stream, arg);
break; break;
......
...@@ -202,7 +202,7 @@ snd_seq_oss_open(struct file *file, int level) ...@@ -202,7 +202,7 @@ snd_seq_oss_open(struct file *file, int level)
dp->index = i; dp->index = i;
if (i >= SNDRV_SEQ_OSS_MAX_CLIENTS) { if (i >= SNDRV_SEQ_OSS_MAX_CLIENTS) {
pr_err("ALSA: seq_oss: too many applications\n"); pr_debug("ALSA: seq_oss: too many applications\n");
rc = -ENOMEM; rc = -ENOMEM;
goto _error; goto _error;
} }
......
...@@ -308,7 +308,7 @@ snd_seq_oss_synth_cleanup(struct seq_oss_devinfo *dp) ...@@ -308,7 +308,7 @@ snd_seq_oss_synth_cleanup(struct seq_oss_devinfo *dp)
struct seq_oss_synth *rec; struct seq_oss_synth *rec;
struct seq_oss_synthinfo *info; struct seq_oss_synthinfo *info;
if (snd_BUG_ON(dp->max_synthdev >= SNDRV_SEQ_OSS_MAX_SYNTH_DEVS)) if (snd_BUG_ON(dp->max_synthdev > SNDRV_SEQ_OSS_MAX_SYNTH_DEVS))
return; return;
for (i = 0; i < dp->max_synthdev; i++) { for (i = 0; i < dp->max_synthdev; i++) {
info = &dp->synths[i]; info = &dp->synths[i];
......
...@@ -87,7 +87,7 @@ MODULE_PARM_DESC(pcm_substreams, "PCM substreams # (1-128) for dummy driver."); ...@@ -87,7 +87,7 @@ MODULE_PARM_DESC(pcm_substreams, "PCM substreams # (1-128) for dummy driver.");
module_param(fake_buffer, bool, 0444); module_param(fake_buffer, bool, 0444);
MODULE_PARM_DESC(fake_buffer, "Fake buffer allocations."); MODULE_PARM_DESC(fake_buffer, "Fake buffer allocations.");
#ifdef CONFIG_HIGH_RES_TIMERS #ifdef CONFIG_HIGH_RES_TIMERS
module_param(hrtimer, bool, 0644); module_param(hrtimer, bool, 0444);
MODULE_PARM_DESC(hrtimer, "Use hrtimer as the timer source."); MODULE_PARM_DESC(hrtimer, "Use hrtimer as the timer source.");
#endif #endif
......
...@@ -47,14 +47,16 @@ static const unsigned int bridgeco_freq_table[] = { ...@@ -47,14 +47,16 @@ static const unsigned int bridgeco_freq_table[] = {
[6] = 0x07, [6] = 0x07,
}; };
static unsigned int static int
get_formation_index(unsigned int rate) get_formation_index(unsigned int rate, unsigned int *index)
{ {
unsigned int i; unsigned int i;
for (i = 0; i < ARRAY_SIZE(snd_bebob_rate_table); i++) { for (i = 0; i < ARRAY_SIZE(snd_bebob_rate_table); i++) {
if (snd_bebob_rate_table[i] == rate) if (snd_bebob_rate_table[i] == rate) {
return i; *index = i;
return 0;
}
} }
return -EINVAL; return -EINVAL;
} }
...@@ -425,7 +427,9 @@ make_both_connections(struct snd_bebob *bebob, unsigned int rate) ...@@ -425,7 +427,9 @@ make_both_connections(struct snd_bebob *bebob, unsigned int rate)
goto end; goto end;
/* confirm params for both streams */ /* confirm params for both streams */
index = get_formation_index(rate); err = get_formation_index(rate, &index);
if (err < 0)
goto end;
pcm_channels = bebob->tx_stream_formations[index].pcm; pcm_channels = bebob->tx_stream_formations[index].pcm;
midi_channels = bebob->tx_stream_formations[index].midi; midi_channels = bebob->tx_stream_formations[index].midi;
err = amdtp_am824_set_parameters(&bebob->tx_stream, rate, err = amdtp_am824_set_parameters(&bebob->tx_stream, rate,
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
config SND_WSS_LIB config SND_WSS_LIB
tristate tristate
select SND_PCM select SND_PCM
select SND_TIMER
config SND_SB_COMMON config SND_SB_COMMON
tristate tristate
...@@ -42,6 +43,7 @@ config SND_AD1816A ...@@ -42,6 +43,7 @@ config SND_AD1816A
select SND_OPL3_LIB select SND_OPL3_LIB
select SND_MPU401_UART select SND_MPU401_UART
select SND_PCM select SND_PCM
select SND_TIMER
help help
Say Y here to include support for Analog Devices SoundPort Say Y here to include support for Analog Devices SoundPort
AD1816A or compatible sound chips. AD1816A or compatible sound chips.
...@@ -209,6 +211,7 @@ config SND_GUSCLASSIC ...@@ -209,6 +211,7 @@ config SND_GUSCLASSIC
tristate "Gravis UltraSound Classic" tristate "Gravis UltraSound Classic"
select SND_RAWMIDI select SND_RAWMIDI
select SND_PCM select SND_PCM
select SND_TIMER
help help
Say Y here to include support for Gravis UltraSound Classic Say Y here to include support for Gravis UltraSound Classic
soundcards. soundcards.
...@@ -221,6 +224,7 @@ config SND_GUSEXTREME ...@@ -221,6 +224,7 @@ config SND_GUSEXTREME
select SND_OPL3_LIB select SND_OPL3_LIB
select SND_MPU401_UART select SND_MPU401_UART
select SND_PCM select SND_PCM
select SND_TIMER
help help
Say Y here to include support for Gravis UltraSound Extreme Say Y here to include support for Gravis UltraSound Extreme
soundcards. soundcards.
......
...@@ -155,6 +155,7 @@ config SND_AZT3328 ...@@ -155,6 +155,7 @@ config SND_AZT3328
select SND_PCM select SND_PCM
select SND_RAWMIDI select SND_RAWMIDI
select SND_AC97_CODEC select SND_AC97_CODEC
select SND_TIMER
depends on ZONE_DMA depends on ZONE_DMA
help help
Say Y here to include support for Aztech AZF3328 (PCI168) Say Y here to include support for Aztech AZF3328 (PCI168)
...@@ -463,6 +464,7 @@ config SND_EMU10K1 ...@@ -463,6 +464,7 @@ config SND_EMU10K1
select SND_HWDEP select SND_HWDEP
select SND_RAWMIDI select SND_RAWMIDI
select SND_AC97_CODEC select SND_AC97_CODEC
select SND_TIMER
depends on ZONE_DMA depends on ZONE_DMA
help help
Say Y to include support for Sound Blaster PCI 512, Live!, Say Y to include support for Sound Blaster PCI 512, Live!,
...@@ -889,6 +891,7 @@ config SND_YMFPCI ...@@ -889,6 +891,7 @@ config SND_YMFPCI
select SND_OPL3_LIB select SND_OPL3_LIB
select SND_MPU401_UART select SND_MPU401_UART
select SND_AC97_CODEC select SND_AC97_CODEC
select SND_TIMER
help help
Say Y here to include support for Yamaha PCI audio chips - Say Y here to include support for Yamaha PCI audio chips -
YMF724, YMF724F, YMF740, YMF740C, YMF744, YMF754. YMF724, YMF724F, YMF740, YMF740C, YMF744, YMF754.
......
...@@ -90,6 +90,8 @@ enum { ...@@ -90,6 +90,8 @@ enum {
#define NVIDIA_HDA_ENABLE_COHBIT 0x01 #define NVIDIA_HDA_ENABLE_COHBIT 0x01
/* Defines for Intel SCH HDA snoop control */ /* Defines for Intel SCH HDA snoop control */
#define INTEL_HDA_CGCTL 0x48
#define INTEL_HDA_CGCTL_MISCBDCGE (0x1 << 6)
#define INTEL_SCH_HDA_DEVC 0x78 #define INTEL_SCH_HDA_DEVC 0x78
#define INTEL_SCH_HDA_DEVC_NOSNOOP (0x1<<11) #define INTEL_SCH_HDA_DEVC_NOSNOOP (0x1<<11)
...@@ -534,10 +536,21 @@ static void hda_intel_init_chip(struct azx *chip, bool full_reset) ...@@ -534,10 +536,21 @@ static void hda_intel_init_chip(struct azx *chip, bool full_reset)
{ {
struct hdac_bus *bus = azx_bus(chip); struct hdac_bus *bus = azx_bus(chip);
struct pci_dev *pci = chip->pci; struct pci_dev *pci = chip->pci;
u32 val;
if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL) if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL)
snd_hdac_set_codec_wakeup(bus, true); snd_hdac_set_codec_wakeup(bus, true);
if (IS_BROXTON(pci)) {
pci_read_config_dword(pci, INTEL_HDA_CGCTL, &val);
val = val & ~INTEL_HDA_CGCTL_MISCBDCGE;
pci_write_config_dword(pci, INTEL_HDA_CGCTL, val);
}
azx_init_chip(chip, full_reset); azx_init_chip(chip, full_reset);
if (IS_BROXTON(pci)) {
pci_read_config_dword(pci, INTEL_HDA_CGCTL, &val);
val = val | INTEL_HDA_CGCTL_MISCBDCGE;
pci_write_config_dword(pci, INTEL_HDA_CGCTL, val);
}
if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL) if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL)
snd_hdac_set_codec_wakeup(bus, false); snd_hdac_set_codec_wakeup(bus, false);
......
...@@ -3653,6 +3653,7 @@ HDA_CODEC_ENTRY(0x10de0070, "GPU 70 HDMI/DP", patch_nvhdmi), ...@@ -3653,6 +3653,7 @@ HDA_CODEC_ENTRY(0x10de0070, "GPU 70 HDMI/DP", patch_nvhdmi),
HDA_CODEC_ENTRY(0x10de0071, "GPU 71 HDMI/DP", patch_nvhdmi), HDA_CODEC_ENTRY(0x10de0071, "GPU 71 HDMI/DP", patch_nvhdmi),
HDA_CODEC_ENTRY(0x10de0072, "GPU 72 HDMI/DP", patch_nvhdmi), HDA_CODEC_ENTRY(0x10de0072, "GPU 72 HDMI/DP", patch_nvhdmi),
HDA_CODEC_ENTRY(0x10de007d, "GPU 7d HDMI/DP", patch_nvhdmi), HDA_CODEC_ENTRY(0x10de007d, "GPU 7d HDMI/DP", patch_nvhdmi),
HDA_CODEC_ENTRY(0x10de0083, "GPU 83 HDMI/DP", patch_nvhdmi),
HDA_CODEC_ENTRY(0x10de8001, "MCP73 HDMI", patch_nvhdmi_2ch), HDA_CODEC_ENTRY(0x10de8001, "MCP73 HDMI", patch_nvhdmi_2ch),
HDA_CODEC_ENTRY(0x11069f80, "VX900 HDMI/DP", patch_via_hdmi), HDA_CODEC_ENTRY(0x11069f80, "VX900 HDMI/DP", patch_via_hdmi),
HDA_CODEC_ENTRY(0x11069f81, "VX900 HDMI/DP", patch_via_hdmi), HDA_CODEC_ENTRY(0x11069f81, "VX900 HDMI/DP", patch_via_hdmi),
......
...@@ -22,6 +22,7 @@ config SND_SUN_AMD7930 ...@@ -22,6 +22,7 @@ config SND_SUN_AMD7930
config SND_SUN_CS4231 config SND_SUN_CS4231
tristate "Sun CS4231" tristate "Sun CS4231"
select SND_PCM select SND_PCM
select SND_TIMER
help help
Say Y here to include support for CS4231 sound device on Sun. Say Y here to include support for CS4231 sound device on Sun.
......
...@@ -1205,8 +1205,12 @@ void snd_usb_set_interface_quirk(struct usb_device *dev) ...@@ -1205,8 +1205,12 @@ void snd_usb_set_interface_quirk(struct usb_device *dev)
* "Playback Design" products need a 50ms delay after setting the * "Playback Design" products need a 50ms delay after setting the
* USB interface. * USB interface.
*/ */
if (le16_to_cpu(dev->descriptor.idVendor) == 0x23ba) switch (le16_to_cpu(dev->descriptor.idVendor)) {
case 0x23ba: /* Playback Design */
case 0x0644: /* TEAC Corp. */
mdelay(50); mdelay(50);
break;
}
} }
void snd_usb_ctl_msg_quirk(struct usb_device *dev, unsigned int pipe, void snd_usb_ctl_msg_quirk(struct usb_device *dev, unsigned int pipe,
...@@ -1221,6 +1225,14 @@ void snd_usb_ctl_msg_quirk(struct usb_device *dev, unsigned int pipe, ...@@ -1221,6 +1225,14 @@ 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)
mdelay(20); mdelay(20);
/*
* "TEAC Corp." products need a 20ms delay after each
* class compliant request
*/
if ((le16_to_cpu(dev->descriptor.idVendor) == 0x0644) &&
(requesttype & USB_TYPE_MASK) == USB_TYPE_CLASS)
mdelay(20);
/* Marantz/Denon devices with USB DAC functionality need a delay /* Marantz/Denon devices with USB DAC functionality need a delay
* after each class compliant request * after each class compliant request
*/ */
......
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