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: Do not announce false surround in Conexant auto
ALSA: HDA: Conexant auto: Handle multiple connections to ADC node
ALSA: HDA: Add position_fix quirk for an Asus device
ALSA: caiaq - Fix possible string-buffer overflow
ALSA: au88x0 - Modify pointer callback to give accurate playback position

+63 -19
+11 -3
sound/pci/au88x0/au88x0_core.c
··· 1252 1252 static int inline vortex_adbdma_getlinearpos(vortex_t * vortex, int adbdma) 1253 1253 { 1254 1254 stream_t *dma = &vortex->dma_adb[adbdma]; 1255 - int temp; 1255 + int temp, page, delta; 1256 1256 1257 1257 temp = hwread(vortex->mmio, VORTEX_ADBDMA_STAT + (adbdma << 2)); 1258 - temp = (dma->period_virt * dma->period_bytes) + (temp & (dma->period_bytes - 1)); 1259 - return temp; 1258 + page = (temp & ADB_SUBBUF_MASK) >> ADB_SUBBUF_SHIFT; 1259 + if (dma->nr_periods >= 4) 1260 + delta = (page - dma->period_real) & 3; 1261 + else { 1262 + delta = (page - dma->period_real); 1263 + if (delta < 0) 1264 + delta += dma->nr_periods; 1265 + } 1266 + return (dma->period_virt + delta) * dma->period_bytes 1267 + + (temp & (dma->period_bytes - 1)); 1260 1268 } 1261 1269 1262 1270 static void vortex_adbdma_startfifo(vortex_t * vortex, int adbdma)
+1
sound/pci/hda/hda_intel.c
··· 2308 2308 SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_LPIB), 2309 2309 SND_PCI_QUIRK(0x1043, 0x81b3, "ASUS", POS_FIX_LPIB), 2310 2310 SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS M2V", POS_FIX_LPIB), 2311 + SND_PCI_QUIRK(0x1043, 0x8410, "ASUS", POS_FIX_LPIB), 2311 2312 SND_PCI_QUIRK(0x104d, 0x9069, "Sony VPCS11V9E", POS_FIX_LPIB), 2312 2313 SND_PCI_QUIRK(0x1106, 0x3288, "ASUS M2V-MX SE", POS_FIX_LPIB), 2313 2314 SND_PCI_QUIRK(0x1179, 0xff10, "Toshiba A100-259", POS_FIX_LPIB),
+49 -14
sound/pci/hda/patch_conexant.c
··· 3410 3410 } 3411 3411 } 3412 3412 spec->multiout.dac_nids = spec->private_dac_nids; 3413 - spec->multiout.max_channels = nums * 2; 3413 + spec->multiout.max_channels = spec->multiout.num_dacs * 2; 3414 3414 3415 3415 if (cfg->hp_outs > 0) 3416 3416 spec->auto_mute = 1; ··· 3729 3729 return 0; 3730 3730 } 3731 3731 3732 - static int cx_auto_add_volume(struct hda_codec *codec, const char *basename, 3732 + static int cx_auto_add_volume_idx(struct hda_codec *codec, const char *basename, 3733 3733 const char *dir, int cidx, 3734 - hda_nid_t nid, int hda_dir) 3734 + hda_nid_t nid, int hda_dir, int amp_idx) 3735 3735 { 3736 3736 static char name[32]; 3737 3737 static struct snd_kcontrol_new knew[] = { ··· 3743 3743 3744 3744 for (i = 0; i < 2; i++) { 3745 3745 struct snd_kcontrol *kctl; 3746 - knew[i].private_value = HDA_COMPOSE_AMP_VAL(nid, 3, 0, hda_dir); 3746 + knew[i].private_value = HDA_COMPOSE_AMP_VAL(nid, 3, amp_idx, 3747 + hda_dir); 3747 3748 knew[i].subdevice = HDA_SUBDEV_AMP_FLAG; 3748 3749 knew[i].index = cidx; 3749 3750 snprintf(name, sizeof(name), "%s%s %s", basename, dir, sfx[i]); ··· 3759 3758 } 3760 3759 return 0; 3761 3760 } 3761 + 3762 + #define cx_auto_add_volume(codec, str, dir, cidx, nid, hda_dir) \ 3763 + cx_auto_add_volume_idx(codec, str, dir, cidx, nid, hda_dir, 0) 3762 3764 3763 3765 #define cx_auto_add_pb_volume(codec, nid, str, idx) \ 3764 3766 cx_auto_add_volume(codec, str, " Playback", idx, nid, HDA_OUTPUT) ··· 3812 3808 struct conexant_spec *spec = codec->spec; 3813 3809 struct auto_pin_cfg *cfg = &spec->autocfg; 3814 3810 static const char *prev_label; 3815 - int i, err, cidx; 3811 + int i, err, cidx, conn_len; 3812 + hda_nid_t conn[HDA_MAX_CONNECTIONS]; 3816 3813 3817 - err = cx_auto_add_volume(codec, "Capture", "", 0, spec->adc_nids[0], 3818 - HDA_INPUT); 3819 - if (err < 0) 3820 - return err; 3814 + int multi_adc_volume = 0; /* If the ADC nid has several input volumes */ 3815 + int adc_nid = spec->adc_nids[0]; 3816 + 3817 + conn_len = snd_hda_get_connections(codec, adc_nid, conn, 3818 + HDA_MAX_CONNECTIONS); 3819 + if (conn_len < 0) 3820 + return conn_len; 3821 + 3822 + multi_adc_volume = cfg->num_inputs > 1 && conn_len > 1; 3823 + if (!multi_adc_volume) { 3824 + err = cx_auto_add_volume(codec, "Capture", "", 0, adc_nid, 3825 + HDA_INPUT); 3826 + if (err < 0) 3827 + return err; 3828 + } 3829 + 3821 3830 prev_label = NULL; 3822 3831 cidx = 0; 3823 3832 for (i = 0; i < cfg->num_inputs; i++) { 3824 3833 hda_nid_t nid = cfg->inputs[i].pin; 3825 3834 const char *label; 3826 - if (!(get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) 3835 + int j; 3836 + int pin_amp = get_wcaps(codec, nid) & AC_WCAP_IN_AMP; 3837 + if (!pin_amp && !multi_adc_volume) 3827 3838 continue; 3839 + 3828 3840 label = hda_get_autocfg_input_label(codec, cfg, i); 3829 3841 if (label == prev_label) 3830 3842 cidx++; 3831 3843 else 3832 3844 cidx = 0; 3833 3845 prev_label = label; 3834 - err = cx_auto_add_volume(codec, label, " Capture", cidx, 3835 - nid, HDA_INPUT); 3836 - if (err < 0) 3837 - return err; 3846 + 3847 + if (pin_amp) { 3848 + err = cx_auto_add_volume(codec, label, " Boost", cidx, 3849 + nid, HDA_INPUT); 3850 + if (err < 0) 3851 + return err; 3852 + } 3853 + 3854 + if (!multi_adc_volume) 3855 + continue; 3856 + for (j = 0; j < conn_len; j++) { 3857 + if (conn[j] == nid) { 3858 + err = cx_auto_add_volume_idx(codec, label, 3859 + " Capture", cidx, adc_nid, HDA_INPUT, j); 3860 + if (err < 0) 3861 + return err; 3862 + break; 3863 + } 3864 + } 3838 3865 } 3839 3866 return 0; 3840 3867 }
+1 -1
sound/usb/caiaq/audio.c
··· 785 785 } 786 786 787 787 dev->pcm->private_data = dev; 788 - strcpy(dev->pcm->name, dev->product_name); 788 + strlcpy(dev->pcm->name, dev->product_name, sizeof(dev->pcm->name)); 789 789 790 790 memset(dev->sub_playback, 0, sizeof(dev->sub_playback)); 791 791 memset(dev->sub_capture, 0, sizeof(dev->sub_capture));
+1 -1
sound/usb/caiaq/midi.c
··· 136 136 if (ret < 0) 137 137 return ret; 138 138 139 - strcpy(rmidi->name, device->product_name); 139 + strlcpy(rmidi->name, device->product_name, sizeof(rmidi->name)); 140 140 141 141 rmidi->info_flags = SNDRV_RAWMIDI_INFO_DUPLEX; 142 142 rmidi->private_data = device;