Commit 7113578a authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6:
  ALSA: hda - Fix ALC861-VD capture source mixer
  ALSA: ac97: add AC97 STMicroelectronics' codecs
  ALSA: ac97: Add Dell Dimension 2400 to Headphone/Line Jack Sense blacklist
  ASoC: Fix WM8350 DSP mode B configuration
  sbawe: fix memory detection part 2
  sound: oss: off by one bug
  ALSA: usb-audio - Avoid Oops after disconnect
  ALSA: test off by one in setsamplerate()
  ALSA: atiixp: Specify codec for Foxconn RC4107MA-RS2
parents 597d8c71 f59bb4b6
...@@ -377,12 +377,13 @@ init_arrays(struct snd_emu8000 *emu) ...@@ -377,12 +377,13 @@ init_arrays(struct snd_emu8000 *emu)
static void __devinit static void __devinit
size_dram(struct snd_emu8000 *emu) size_dram(struct snd_emu8000 *emu)
{ {
int i, size; int i, size, detected_size;
if (emu->dram_checked) if (emu->dram_checked)
return; return;
size = 0; size = 0;
detected_size = 0;
/* write out a magic number */ /* write out a magic number */
snd_emu8000_dma_chan(emu, 0, EMU8000_RAM_WRITE); snd_emu8000_dma_chan(emu, 0, EMU8000_RAM_WRITE);
...@@ -393,6 +394,8 @@ size_dram(struct snd_emu8000 *emu) ...@@ -393,6 +394,8 @@ size_dram(struct snd_emu8000 *emu)
while (size < EMU8000_MAX_DRAM) { while (size < EMU8000_MAX_DRAM) {
size += 512 * 1024; /* increment 512kbytes */
/* Write a unique data on the test address. /* Write a unique data on the test address.
* if the address is out of range, the data is written on * if the address is out of range, the data is written on
* 0x200000(=EMU8000_DRAM_OFFSET). Then the id word is * 0x200000(=EMU8000_DRAM_OFFSET). Then the id word is
...@@ -414,7 +417,7 @@ size_dram(struct snd_emu8000 *emu) ...@@ -414,7 +417,7 @@ size_dram(struct snd_emu8000 *emu)
if (EMU8000_SMLD_READ(emu) != UNIQUE_ID2) if (EMU8000_SMLD_READ(emu) != UNIQUE_ID2)
break; /* no memory at this address */ break; /* no memory at this address */
size += 512 * 1024; /* increment 512kbytes */ detected_size = size;
snd_emu8000_read_wait(emu); snd_emu8000_read_wait(emu);
...@@ -442,9 +445,9 @@ size_dram(struct snd_emu8000 *emu) ...@@ -442,9 +445,9 @@ size_dram(struct snd_emu8000 *emu)
snd_emu8000_dma_chan(emu, 1, EMU8000_RAM_CLOSE); snd_emu8000_dma_chan(emu, 1, EMU8000_RAM_CLOSE);
snd_printdd("EMU8000 [0x%lx]: %d Kb on-board memory detected\n", snd_printdd("EMU8000 [0x%lx]: %d Kb on-board memory detected\n",
emu->port1, size/1024); emu->port1, detected_size/1024);
emu->mem_size = size; emu->mem_size = detected_size;
emu->dram_checked = 1; emu->dram_checked = 1;
} }
......
...@@ -67,14 +67,15 @@ int sound_install_audiodrv(int vers, char *name, struct audio_driver *driver, ...@@ -67,14 +67,15 @@ int sound_install_audiodrv(int vers, char *name, struct audio_driver *driver,
return -(EBUSY); return -(EBUSY);
} }
d = (struct audio_driver *) (sound_mem_blocks[sound_nblocks] = vmalloc(sizeof(struct audio_driver))); d = (struct audio_driver *) (sound_mem_blocks[sound_nblocks] = vmalloc(sizeof(struct audio_driver)));
sound_nblocks++;
if (sound_nblocks < 1024) if (sound_nblocks >= MAX_MEM_BLOCKS)
sound_nblocks++; sound_nblocks = MAX_MEM_BLOCKS - 1;
op = (struct audio_operations *) (sound_mem_blocks[sound_nblocks] = vmalloc(sizeof(struct audio_operations))); op = (struct audio_operations *) (sound_mem_blocks[sound_nblocks] = vmalloc(sizeof(struct audio_operations)));
sound_nblocks++;
if (sound_nblocks >= MAX_MEM_BLOCKS)
sound_nblocks = MAX_MEM_BLOCKS - 1;
if (sound_nblocks < 1024)
sound_nblocks++;
if (d == NULL || op == NULL) { if (d == NULL || op == NULL) {
printk(KERN_ERR "Sound: Can't allocate driver for (%s)\n", name); printk(KERN_ERR "Sound: Can't allocate driver for (%s)\n", name);
sound_unload_audiodev(num); sound_unload_audiodev(num);
...@@ -128,9 +129,10 @@ int sound_install_mixer(int vers, char *name, struct mixer_operations *driver, ...@@ -128,9 +129,10 @@ int sound_install_mixer(int vers, char *name, struct mixer_operations *driver,
until you unload sound! */ until you unload sound! */
op = (struct mixer_operations *) (sound_mem_blocks[sound_nblocks] = vmalloc(sizeof(struct mixer_operations))); op = (struct mixer_operations *) (sound_mem_blocks[sound_nblocks] = vmalloc(sizeof(struct mixer_operations)));
sound_nblocks++;
if (sound_nblocks >= MAX_MEM_BLOCKS)
sound_nblocks = MAX_MEM_BLOCKS - 1;
if (sound_nblocks < 1024)
sound_nblocks++;
if (op == NULL) { if (op == NULL) {
printk(KERN_ERR "Sound: Can't allocate mixer driver for (%s)\n", name); printk(KERN_ERR "Sound: Can't allocate mixer driver for (%s)\n", name);
return -ENOMEM; return -ENOMEM;
......
...@@ -142,4 +142,6 @@ static inline int translate_mode(struct file *file) ...@@ -142,4 +142,6 @@ static inline int translate_mode(struct file *file)
#define TIMER_ARMED 121234 #define TIMER_ARMED 121234
#define TIMER_NOT_ARMED 1 #define TIMER_NOT_ARMED 1
#define MAX_MEM_BLOCKS 1024
#endif #endif
...@@ -56,7 +56,7 @@ ...@@ -56,7 +56,7 @@
/* /*
* Table for permanently allocated memory (used when unloading the module) * Table for permanently allocated memory (used when unloading the module)
*/ */
void * sound_mem_blocks[1024]; void * sound_mem_blocks[MAX_MEM_BLOCKS];
int sound_nblocks = 0; int sound_nblocks = 0;
/* Persistent DMA buffers */ /* Persistent DMA buffers */
...@@ -574,7 +574,7 @@ static int __init oss_init(void) ...@@ -574,7 +574,7 @@ static int __init oss_init(void)
NULL, "%s%d", dev_list[i].name, j); NULL, "%s%d", dev_list[i].name, j);
} }
if (sound_nblocks >= 1024) if (sound_nblocks >= MAX_MEM_BLOCKS - 1)
printk(KERN_ERR "Sound warning: Deallocation table was too small.\n"); printk(KERN_ERR "Sound warning: Deallocation table was too small.\n");
return 0; return 0;
......
...@@ -83,6 +83,7 @@ static const struct ac97_codec_id snd_ac97_codec_id_vendors[] = { ...@@ -83,6 +83,7 @@ static const struct ac97_codec_id snd_ac97_codec_id_vendors[] = {
{ 0x4e534300, 0xffffff00, "National Semiconductor", NULL, NULL }, { 0x4e534300, 0xffffff00, "National Semiconductor", NULL, NULL },
{ 0x50534300, 0xffffff00, "Philips", NULL, NULL }, { 0x50534300, 0xffffff00, "Philips", NULL, NULL },
{ 0x53494c00, 0xffffff00, "Silicon Laboratory", NULL, NULL }, { 0x53494c00, 0xffffff00, "Silicon Laboratory", NULL, NULL },
{ 0x53544d00, 0xffffff00, "STMicroelectronics", NULL, NULL },
{ 0x54524100, 0xffffff00, "TriTech", NULL, NULL }, { 0x54524100, 0xffffff00, "TriTech", NULL, NULL },
{ 0x54584e00, 0xffffff00, "Texas Instruments", NULL, NULL }, { 0x54584e00, 0xffffff00, "Texas Instruments", NULL, NULL },
{ 0x56494100, 0xffffff00, "VIA Technologies", NULL, NULL }, { 0x56494100, 0xffffff00, "VIA Technologies", NULL, NULL },
...@@ -161,6 +162,7 @@ static const struct ac97_codec_id snd_ac97_codec_ids[] = { ...@@ -161,6 +162,7 @@ static const struct ac97_codec_id snd_ac97_codec_ids[] = {
{ 0x4e534350, 0xffffffff, "LM4550", patch_lm4550, NULL }, // volume wrap fix { 0x4e534350, 0xffffffff, "LM4550", patch_lm4550, NULL }, // volume wrap fix
{ 0x50534304, 0xffffffff, "UCB1400", patch_ucb1400, NULL }, { 0x50534304, 0xffffffff, "UCB1400", patch_ucb1400, NULL },
{ 0x53494c20, 0xffffffe0, "Si3036,8", mpatch_si3036, mpatch_si3036, AC97_MODEM_PATCH }, { 0x53494c20, 0xffffffe0, "Si3036,8", mpatch_si3036, mpatch_si3036, AC97_MODEM_PATCH },
{ 0x53544d02, 0xffffffff, "ST7597", NULL, NULL },
{ 0x54524102, 0xffffffff, "TR28022", NULL, NULL }, { 0x54524102, 0xffffffff, "TR28022", NULL, NULL },
{ 0x54524103, 0xffffffff, "TR28023", NULL, NULL }, { 0x54524103, 0xffffffff, "TR28023", NULL, NULL },
{ 0x54524106, 0xffffffff, "TR28026", NULL, NULL }, { 0x54524106, 0xffffffff, "TR28026", NULL, NULL },
...@@ -213,6 +215,14 @@ static int snd_ac97_valid_reg(struct snd_ac97 *ac97, unsigned short reg) ...@@ -213,6 +215,14 @@ static int snd_ac97_valid_reg(struct snd_ac97 *ac97, unsigned short reg)
{ {
/* filter some registers for buggy codecs */ /* filter some registers for buggy codecs */
switch (ac97->id) { switch (ac97->id) {
case AC97_ID_ST_AC97_ID4:
if (reg == 0x08)
return 0;
/* fall through */
case AC97_ID_ST7597:
if (reg == 0x22 || reg == 0x7a)
return 1;
/* fall through */
case AC97_ID_AK4540: case AC97_ID_AK4540:
case AC97_ID_AK4542: case AC97_ID_AK4542:
if (reg <= 0x1c || reg == 0x20 || reg == 0x26 || reg >= 0x7c) if (reg <= 0x1c || reg == 0x20 || reg == 0x26 || reg >= 0x7c)
......
...@@ -62,3 +62,5 @@ ...@@ -62,3 +62,5 @@
#define AC97_ID_CM9761_78 0x434d4978 #define AC97_ID_CM9761_78 0x434d4978
#define AC97_ID_CM9761_82 0x434d4982 #define AC97_ID_CM9761_82 0x434d4982
#define AC97_ID_CM9761_83 0x434d4983 #define AC97_ID_CM9761_83 0x434d4983
#define AC97_ID_ST7597 0x53544d02
#define AC97_ID_ST_AC97_ID4 0x53544d04
...@@ -1870,6 +1870,7 @@ static unsigned int ad1981_jacks_blacklist[] = { ...@@ -1870,6 +1870,7 @@ static unsigned int ad1981_jacks_blacklist[] = {
0x10140554, /* Thinkpad T42p/R50p */ 0x10140554, /* Thinkpad T42p/R50p */
0x10140567, /* Thinkpad T43p 2668-G7U */ 0x10140567, /* Thinkpad T43p 2668-G7U */
0x10140581, /* Thinkpad X41-2527 */ 0x10140581, /* Thinkpad X41-2527 */
0x10280160, /* Dell Dimension 2400 */
0x104380b0, /* Asus A7V8X-MX */ 0x104380b0, /* Asus A7V8X-MX */
0x11790241, /* Toshiba Satellite A-15 S127 */ 0x11790241, /* Toshiba Satellite A-15 S127 */
0x144dc01a, /* Samsung NP-X20C004/SEG */ 0x144dc01a, /* Samsung NP-X20C004/SEG */
......
...@@ -297,6 +297,7 @@ static struct pci_device_id snd_atiixp_ids[] = { ...@@ -297,6 +297,7 @@ static struct pci_device_id snd_atiixp_ids[] = {
MODULE_DEVICE_TABLE(pci, snd_atiixp_ids); MODULE_DEVICE_TABLE(pci, snd_atiixp_ids);
static struct snd_pci_quirk atiixp_quirks[] __devinitdata = { static struct snd_pci_quirk atiixp_quirks[] __devinitdata = {
SND_PCI_QUIRK(0x105b, 0x0c81, "Foxconn RC4107MA-RS2", 0),
SND_PCI_QUIRK(0x15bd, 0x3100, "DFI RS482", 0), SND_PCI_QUIRK(0x15bd, 0x3100, "DFI RS482", 0),
{ } /* terminator */ { } /* terminator */
}; };
......
...@@ -15493,7 +15493,7 @@ static struct alc_config_preset alc861vd_presets[] = { ...@@ -15493,7 +15493,7 @@ static struct alc_config_preset alc861vd_presets[] = {
static int alc861vd_auto_create_input_ctls(struct hda_codec *codec, static int alc861vd_auto_create_input_ctls(struct hda_codec *codec,
const struct auto_pin_cfg *cfg) const struct auto_pin_cfg *cfg)
{ {
return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x09, 0); return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x22, 0);
} }
......
...@@ -1058,7 +1058,7 @@ setsamplerate(struct cmdif *cif, unsigned char *intdec, unsigned int rate) ...@@ -1058,7 +1058,7 @@ setsamplerate(struct cmdif *cif, unsigned char *intdec, unsigned int rate)
rptr.retwords[2] != M && rptr.retwords[2] != M &&
rptr.retwords[3] != N && rptr.retwords[3] != N &&
i++ < MAX_WRITE_RETRY); i++ < MAX_WRITE_RETRY);
if (i == MAX_WRITE_RETRY) { if (i > MAX_WRITE_RETRY) {
snd_printdd("sent samplerate %d: %d failed\n", snd_printdd("sent samplerate %d: %d failed\n",
*intdec, rate); *intdec, rate);
return -EIO; return -EIO;
......
...@@ -925,7 +925,7 @@ static int wm8350_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) ...@@ -925,7 +925,7 @@ static int wm8350_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
iface |= 0x3 << 8; iface |= 0x3 << 8;
break; break;
case SND_SOC_DAIFMT_DSP_B: case SND_SOC_DAIFMT_DSP_B:
iface |= 0x3 << 8; /* lg not sure which mode */ iface |= 0x3 << 8 | WM8350_AIF_LRCLK_INV;
break; break;
default: default:
return -EINVAL; return -EINVAL;
......
...@@ -1936,7 +1936,7 @@ static int snd_usb_pcm_close(struct snd_pcm_substream *substream, int direction) ...@@ -1936,7 +1936,7 @@ static int snd_usb_pcm_close(struct snd_pcm_substream *substream, int direction)
struct snd_usb_stream *as = snd_pcm_substream_chip(substream); struct snd_usb_stream *as = snd_pcm_substream_chip(substream);
struct snd_usb_substream *subs = &as->substream[direction]; struct snd_usb_substream *subs = &as->substream[direction];
if (subs->interface >= 0) { if (!as->chip->shutdown && subs->interface >= 0) {
usb_set_interface(subs->dev, subs->interface, 0); usb_set_interface(subs->dev, subs->interface, 0);
subs->interface = -1; subs->interface = -1;
} }
......
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