diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-07-27 15:17:29 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-07-27 15:17:29 -0400 |
| commit | b54c3835469c9548d470e7788cb22a2fd7e21133 (patch) | |
| tree | 62e89f7b5ec4acc66bdca7bc7d51bcc44b62357f | |
| parent | 04fc0a4097014db7c22da33a56494e3e8a1895d5 (diff) | |
| parent | 57e4a5c4f8cfb4b198830c5400f9fc9eb7b75091 (diff) | |
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 mute control with some ALC262 models
ALSA: snd_usb_caiaq: add support for Audio2DJ
ALSA: pcm - Fix hwptr buffer-size overlap bug
ALSA: pcm - Fix warnings in debug loggings
ALSA: pcm - Add logging of hwptr updates and interrupt updates
ASoC: tlv320aic3x: Enable PLL when not bypassed
ALSA: hda - Restore GPIO1 properly at resume with AD1984A
ALSA: ctxfi - Fix uninitialized error checks
ALSA: hda - Use snprintf() to be safer
ALSA: usb-audio - Volume control quirk for QuickCam E 3500
ALSA: pcm - Fix regressions with VMware
| -rw-r--r-- | Documentation/sound/alsa/Procfile.txt | 5 | ||||
| -rw-r--r-- | sound/core/pcm_lib.c | 36 | ||||
| -rw-r--r-- | sound/pci/ctxfi/ctamixer.c | 14 | ||||
| -rw-r--r-- | sound/pci/ctxfi/ctsrc.c | 7 | ||||
| -rw-r--r-- | sound/pci/hda/patch_analog.c | 2 | ||||
| -rw-r--r-- | sound/pci/hda/patch_realtek.c | 33 | ||||
| -rw-r--r-- | sound/pci/hda/patch_sigmatel.c | 2 | ||||
| -rw-r--r-- | sound/soc/codecs/tlv320aic3x.c | 11 | ||||
| -rw-r--r-- | sound/usb/Kconfig | 1 | ||||
| -rw-r--r-- | sound/usb/caiaq/audio.c | 1 | ||||
| -rw-r--r-- | sound/usb/caiaq/device.c | 8 | ||||
| -rw-r--r-- | sound/usb/caiaq/device.h | 1 | ||||
| -rw-r--r-- | sound/usb/usbmixer.c | 25 |
13 files changed, 107 insertions, 39 deletions
diff --git a/Documentation/sound/alsa/Procfile.txt b/Documentation/sound/alsa/Procfile.txt index 381908d8ca42..719a819f8cc2 100644 --- a/Documentation/sound/alsa/Procfile.txt +++ b/Documentation/sound/alsa/Procfile.txt | |||
| @@ -101,6 +101,8 @@ card*/pcm*/xrun_debug | |||
| 101 | bit 0 = Enable XRUN/jiffies debug messages | 101 | bit 0 = Enable XRUN/jiffies debug messages |
| 102 | bit 1 = Show stack trace at XRUN / jiffies check | 102 | bit 1 = Show stack trace at XRUN / jiffies check |
| 103 | bit 2 = Enable additional jiffies check | 103 | bit 2 = Enable additional jiffies check |
| 104 | bit 3 = Log hwptr update at each period interrupt | ||
| 105 | bit 4 = Log hwptr update at each snd_pcm_update_hw_ptr() | ||
| 104 | 106 | ||
| 105 | When the bit 0 is set, the driver will show the messages to | 107 | When the bit 0 is set, the driver will show the messages to |
| 106 | kernel log when an xrun is detected. The debug message is | 108 | kernel log when an xrun is detected. The debug message is |
| @@ -117,6 +119,9 @@ card*/pcm*/xrun_debug | |||
| 117 | buggy) hardware that doesn't give smooth pointer updates. | 119 | buggy) hardware that doesn't give smooth pointer updates. |
| 118 | This feature is enabled via the bit 2. | 120 | This feature is enabled via the bit 2. |
| 119 | 121 | ||
| 122 | Bits 3 and 4 are for logging the hwptr records. Note that | ||
| 123 | these will give flood of kernel messages. | ||
| 124 | |||
| 120 | card*/pcm*/sub*/info | 125 | card*/pcm*/sub*/info |
| 121 | The general information of this PCM sub-stream. | 126 | The general information of this PCM sub-stream. |
| 122 | 127 | ||
diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c index 333e4dd29450..72cfd47af6b8 100644 --- a/sound/core/pcm_lib.c +++ b/sound/core/pcm_lib.c | |||
| @@ -233,6 +233,18 @@ static int snd_pcm_update_hw_ptr_interrupt(struct snd_pcm_substream *substream) | |||
| 233 | xrun(substream); | 233 | xrun(substream); |
| 234 | return -EPIPE; | 234 | return -EPIPE; |
| 235 | } | 235 | } |
| 236 | if (xrun_debug(substream, 8)) { | ||
| 237 | char name[16]; | ||
| 238 | pcm_debug_name(substream, name, sizeof(name)); | ||
| 239 | snd_printd("period_update: %s: pos=0x%x/0x%x/0x%x, " | ||
| 240 | "hwptr=0x%lx, hw_base=0x%lx, hw_intr=0x%lx\n", | ||
| 241 | name, (unsigned int)pos, | ||
| 242 | (unsigned int)runtime->period_size, | ||
| 243 | (unsigned int)runtime->buffer_size, | ||
| 244 | (unsigned long)old_hw_ptr, | ||
| 245 | (unsigned long)runtime->hw_ptr_base, | ||
| 246 | (unsigned long)runtime->hw_ptr_interrupt); | ||
| 247 | } | ||
| 236 | hw_base = runtime->hw_ptr_base; | 248 | hw_base = runtime->hw_ptr_base; |
| 237 | new_hw_ptr = hw_base + pos; | 249 | new_hw_ptr = hw_base + pos; |
| 238 | hw_ptr_interrupt = runtime->hw_ptr_interrupt + runtime->period_size; | 250 | hw_ptr_interrupt = runtime->hw_ptr_interrupt + runtime->period_size; |
| @@ -244,18 +256,27 @@ static int snd_pcm_update_hw_ptr_interrupt(struct snd_pcm_substream *substream) | |||
| 244 | delta = new_hw_ptr - hw_ptr_interrupt; | 256 | delta = new_hw_ptr - hw_ptr_interrupt; |
| 245 | } | 257 | } |
| 246 | if (delta < 0) { | 258 | if (delta < 0) { |
| 247 | delta += runtime->buffer_size; | 259 | if (runtime->periods == 1 || new_hw_ptr < old_hw_ptr) |
| 260 | delta += runtime->buffer_size; | ||
| 248 | if (delta < 0) { | 261 | if (delta < 0) { |
| 249 | hw_ptr_error(substream, | 262 | hw_ptr_error(substream, |
| 250 | "Unexpected hw_pointer value " | 263 | "Unexpected hw_pointer value " |
| 251 | "(stream=%i, pos=%ld, intr_ptr=%ld)\n", | 264 | "(stream=%i, pos=%ld, intr_ptr=%ld)\n", |
| 252 | substream->stream, (long)pos, | 265 | substream->stream, (long)pos, |
| 253 | (long)hw_ptr_interrupt); | 266 | (long)hw_ptr_interrupt); |
| 267 | #if 1 | ||
| 268 | /* simply skipping the hwptr update seems more | ||
| 269 | * robust in some cases, e.g. on VMware with | ||
| 270 | * inaccurate timer source | ||
| 271 | */ | ||
| 272 | return 0; /* skip this update */ | ||
| 273 | #else | ||
| 254 | /* rebase to interrupt position */ | 274 | /* rebase to interrupt position */ |
| 255 | hw_base = new_hw_ptr = hw_ptr_interrupt; | 275 | hw_base = new_hw_ptr = hw_ptr_interrupt; |
| 256 | /* align hw_base to buffer_size */ | 276 | /* align hw_base to buffer_size */ |
| 257 | hw_base -= hw_base % runtime->buffer_size; | 277 | hw_base -= hw_base % runtime->buffer_size; |
| 258 | delta = 0; | 278 | delta = 0; |
| 279 | #endif | ||
| 259 | } else { | 280 | } else { |
| 260 | hw_base += runtime->buffer_size; | 281 | hw_base += runtime->buffer_size; |
| 261 | if (hw_base >= runtime->boundary) | 282 | if (hw_base >= runtime->boundary) |
| @@ -344,6 +365,19 @@ int snd_pcm_update_hw_ptr(struct snd_pcm_substream *substream) | |||
| 344 | xrun(substream); | 365 | xrun(substream); |
| 345 | return -EPIPE; | 366 | return -EPIPE; |
| 346 | } | 367 | } |
| 368 | if (xrun_debug(substream, 16)) { | ||
| 369 | char name[16]; | ||
| 370 | pcm_debug_name(substream, name, sizeof(name)); | ||
| 371 | snd_printd("hw_update: %s: pos=0x%x/0x%x/0x%x, " | ||
| 372 | "hwptr=0x%lx, hw_base=0x%lx, hw_intr=0x%lx\n", | ||
| 373 | name, (unsigned int)pos, | ||
| 374 | (unsigned int)runtime->period_size, | ||
| 375 | (unsigned int)runtime->buffer_size, | ||
| 376 | (unsigned long)old_hw_ptr, | ||
| 377 | (unsigned long)runtime->hw_ptr_base, | ||
| 378 | (unsigned long)runtime->hw_ptr_interrupt); | ||
| 379 | } | ||
| 380 | |||
| 347 | hw_base = runtime->hw_ptr_base; | 381 | hw_base = runtime->hw_ptr_base; |
| 348 | new_hw_ptr = hw_base + pos; | 382 | new_hw_ptr = hw_base + pos; |
| 349 | 383 | ||
diff --git a/sound/pci/ctxfi/ctamixer.c b/sound/pci/ctxfi/ctamixer.c index a1db51b3ead8..a7f4a671f7b7 100644 --- a/sound/pci/ctxfi/ctamixer.c +++ b/sound/pci/ctxfi/ctamixer.c | |||
| @@ -242,13 +242,12 @@ static int get_amixer_rsc(struct amixer_mgr *mgr, | |||
| 242 | 242 | ||
| 243 | /* Allocate mem for amixer resource */ | 243 | /* Allocate mem for amixer resource */ |
| 244 | amixer = kzalloc(sizeof(*amixer), GFP_KERNEL); | 244 | amixer = kzalloc(sizeof(*amixer), GFP_KERNEL); |
| 245 | if (NULL == amixer) { | 245 | if (!amixer) |
| 246 | err = -ENOMEM; | 246 | return -ENOMEM; |
| 247 | return err; | ||
| 248 | } | ||
| 249 | 247 | ||
| 250 | /* Check whether there are sufficient | 248 | /* Check whether there are sufficient |
| 251 | * amixer resources to meet request. */ | 249 | * amixer resources to meet request. */ |
| 250 | err = 0; | ||
| 252 | spin_lock_irqsave(&mgr->mgr_lock, flags); | 251 | spin_lock_irqsave(&mgr->mgr_lock, flags); |
| 253 | for (i = 0; i < desc->msr; i++) { | 252 | for (i = 0; i < desc->msr; i++) { |
| 254 | err = mgr_get_resource(&mgr->mgr, 1, &idx); | 253 | err = mgr_get_resource(&mgr->mgr, 1, &idx); |
| @@ -397,12 +396,11 @@ static int get_sum_rsc(struct sum_mgr *mgr, | |||
| 397 | 396 | ||
| 398 | /* Allocate mem for sum resource */ | 397 | /* Allocate mem for sum resource */ |
| 399 | sum = kzalloc(sizeof(*sum), GFP_KERNEL); | 398 | sum = kzalloc(sizeof(*sum), GFP_KERNEL); |
| 400 | if (NULL == sum) { | 399 | if (!sum) |
| 401 | err = -ENOMEM; | 400 | return -ENOMEM; |
| 402 | return err; | ||
| 403 | } | ||
| 404 | 401 | ||
| 405 | /* Check whether there are sufficient sum resources to meet request. */ | 402 | /* Check whether there are sufficient sum resources to meet request. */ |
| 403 | err = 0; | ||
| 406 | spin_lock_irqsave(&mgr->mgr_lock, flags); | 404 | spin_lock_irqsave(&mgr->mgr_lock, flags); |
| 407 | for (i = 0; i < desc->msr; i++) { | 405 | for (i = 0; i < desc->msr; i++) { |
| 408 | err = mgr_get_resource(&mgr->mgr, 1, &idx); | 406 | err = mgr_get_resource(&mgr->mgr, 1, &idx); |
diff --git a/sound/pci/ctxfi/ctsrc.c b/sound/pci/ctxfi/ctsrc.c index e1c145d8b702..df43a5cd3938 100644 --- a/sound/pci/ctxfi/ctsrc.c +++ b/sound/pci/ctxfi/ctsrc.c | |||
| @@ -724,12 +724,11 @@ static int get_srcimp_rsc(struct srcimp_mgr *mgr, | |||
| 724 | 724 | ||
| 725 | /* Allocate mem for SRCIMP resource */ | 725 | /* Allocate mem for SRCIMP resource */ |
| 726 | srcimp = kzalloc(sizeof(*srcimp), GFP_KERNEL); | 726 | srcimp = kzalloc(sizeof(*srcimp), GFP_KERNEL); |
| 727 | if (NULL == srcimp) { | 727 | if (!srcimp) |
| 728 | err = -ENOMEM; | 728 | return -ENOMEM; |
| 729 | return err; | ||
| 730 | } | ||
| 731 | 729 | ||
| 732 | /* Check whether there are sufficient SRCIMP resources. */ | 730 | /* Check whether there are sufficient SRCIMP resources. */ |
| 731 | err = 0; | ||
| 733 | spin_lock_irqsave(&mgr->mgr_lock, flags); | 732 | spin_lock_irqsave(&mgr->mgr_lock, flags); |
| 734 | for (i = 0; i < desc->msr; i++) { | 733 | for (i = 0; i < desc->msr; i++) { |
| 735 | err = mgr_get_resource(&mgr->mgr, 1, &idx); | 734 | err = mgr_get_resource(&mgr->mgr, 1, &idx); |
diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c index be7d25fa7f35..3da85caf8af1 100644 --- a/sound/pci/hda/patch_analog.c +++ b/sound/pci/hda/patch_analog.c | |||
| @@ -3754,7 +3754,7 @@ static int ad1884a_mobile_master_sw_put(struct snd_kcontrol *kcontrol, | |||
| 3754 | int mute = (!ucontrol->value.integer.value[0] && | 3754 | int mute = (!ucontrol->value.integer.value[0] && |
| 3755 | !ucontrol->value.integer.value[1]); | 3755 | !ucontrol->value.integer.value[1]); |
| 3756 | /* toggle GPIO1 according to the mute state */ | 3756 | /* toggle GPIO1 according to the mute state */ |
| 3757 | snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, | 3757 | snd_hda_codec_write_cache(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, |
| 3758 | mute ? 0x02 : 0x0); | 3758 | mute ? 0x02 : 0x0); |
| 3759 | return ret; | 3759 | return ret; |
| 3760 | } | 3760 | } |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 7e99763ca527..8c8b273116fb 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -10631,6 +10631,18 @@ static void alc262_lenovo_3000_unsol_event(struct hda_codec *codec, | |||
| 10631 | alc262_lenovo_3000_automute(codec, 1); | 10631 | alc262_lenovo_3000_automute(codec, 1); |
| 10632 | } | 10632 | } |
| 10633 | 10633 | ||
| 10634 | static int amp_stereo_mute_update(struct hda_codec *codec, hda_nid_t nid, | ||
| 10635 | int dir, int idx, long *valp) | ||
| 10636 | { | ||
| 10637 | int i, change = 0; | ||
| 10638 | |||
| 10639 | for (i = 0; i < 2; i++, valp++) | ||
| 10640 | change |= snd_hda_codec_amp_update(codec, nid, i, dir, idx, | ||
| 10641 | HDA_AMP_MUTE, | ||
| 10642 | *valp ? 0 : HDA_AMP_MUTE); | ||
| 10643 | return change; | ||
| 10644 | } | ||
| 10645 | |||
| 10634 | /* bind hp and internal speaker mute (with plug check) */ | 10646 | /* bind hp and internal speaker mute (with plug check) */ |
| 10635 | static int alc262_fujitsu_master_sw_put(struct snd_kcontrol *kcontrol, | 10647 | static int alc262_fujitsu_master_sw_put(struct snd_kcontrol *kcontrol, |
| 10636 | struct snd_ctl_elem_value *ucontrol) | 10648 | struct snd_ctl_elem_value *ucontrol) |
| @@ -10639,13 +10651,8 @@ static int alc262_fujitsu_master_sw_put(struct snd_kcontrol *kcontrol, | |||
| 10639 | long *valp = ucontrol->value.integer.value; | 10651 | long *valp = ucontrol->value.integer.value; |
| 10640 | int change; | 10652 | int change; |
| 10641 | 10653 | ||
| 10642 | change = snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, | 10654 | change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp); |
| 10643 | HDA_AMP_MUTE, | 10655 | change |= amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp); |
| 10644 | valp ? 0 : HDA_AMP_MUTE); | ||
| 10645 | change |= snd_hda_codec_amp_stereo(codec, 0x1b, HDA_OUTPUT, 0, | ||
| 10646 | HDA_AMP_MUTE, | ||
| 10647 | valp ? 0 : HDA_AMP_MUTE); | ||
| 10648 | |||
| 10649 | if (change) | 10656 | if (change) |
| 10650 | alc262_fujitsu_automute(codec, 0); | 10657 | alc262_fujitsu_automute(codec, 0); |
| 10651 | return change; | 10658 | return change; |
| @@ -10680,10 +10687,7 @@ static int alc262_lenovo_3000_master_sw_put(struct snd_kcontrol *kcontrol, | |||
| 10680 | long *valp = ucontrol->value.integer.value; | 10687 | long *valp = ucontrol->value.integer.value; |
| 10681 | int change; | 10688 | int change; |
| 10682 | 10689 | ||
| 10683 | change = snd_hda_codec_amp_stereo(codec, 0x1b, HDA_OUTPUT, 0, | 10690 | change = amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp); |
| 10684 | HDA_AMP_MUTE, | ||
| 10685 | valp ? 0 : HDA_AMP_MUTE); | ||
| 10686 | |||
| 10687 | if (change) | 10691 | if (change) |
| 10688 | alc262_lenovo_3000_automute(codec, 0); | 10692 | alc262_lenovo_3000_automute(codec, 0); |
| 10689 | return change; | 10693 | return change; |
| @@ -11854,12 +11858,7 @@ static int alc268_acer_master_sw_put(struct snd_kcontrol *kcontrol, | |||
| 11854 | long *valp = ucontrol->value.integer.value; | 11858 | long *valp = ucontrol->value.integer.value; |
| 11855 | int change; | 11859 | int change; |
| 11856 | 11860 | ||
| 11857 | change = snd_hda_codec_amp_update(codec, 0x14, 0, HDA_OUTPUT, 0, | 11861 | change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp); |
| 11858 | HDA_AMP_MUTE, | ||
| 11859 | valp[0] ? 0 : HDA_AMP_MUTE); | ||
| 11860 | change |= snd_hda_codec_amp_update(codec, 0x14, 1, HDA_OUTPUT, 0, | ||
| 11861 | HDA_AMP_MUTE, | ||
| 11862 | valp[1] ? 0 : HDA_AMP_MUTE); | ||
| 11863 | if (change) | 11862 | if (change) |
| 11864 | alc268_acer_automute(codec, 0); | 11863 | alc268_acer_automute(codec, 0); |
| 11865 | return change; | 11864 | return change; |
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index da7f9f65c047..512f3b9b9a45 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
| @@ -4066,7 +4066,7 @@ static int stac92xx_add_jack(struct hda_codec *codec, | |||
| 4066 | jack->nid = nid; | 4066 | jack->nid = nid; |
| 4067 | jack->type = type; | 4067 | jack->type = type; |
| 4068 | 4068 | ||
| 4069 | sprintf(name, "%s at %s %s Jack", | 4069 | snprintf(name, sizeof(name), "%s at %s %s Jack", |
| 4070 | snd_hda_get_jack_type(def_conf), | 4070 | snd_hda_get_jack_type(def_conf), |
| 4071 | snd_hda_get_jack_connectivity(def_conf), | 4071 | snd_hda_get_jack_connectivity(def_conf), |
| 4072 | snd_hda_get_jack_location(def_conf)); | 4072 | snd_hda_get_jack_location(def_conf)); |
diff --git a/sound/soc/codecs/tlv320aic3x.c b/sound/soc/codecs/tlv320aic3x.c index ab099f482487..cb0d1bf34b57 100644 --- a/sound/soc/codecs/tlv320aic3x.c +++ b/sound/soc/codecs/tlv320aic3x.c | |||
| @@ -767,6 +767,7 @@ static int aic3x_hw_params(struct snd_pcm_substream *substream, | |||
| 767 | int codec_clk = 0, bypass_pll = 0, fsref, last_clk = 0; | 767 | int codec_clk = 0, bypass_pll = 0, fsref, last_clk = 0; |
| 768 | u8 data, r, p, pll_q, pll_p = 1, pll_r = 1, pll_j = 1; | 768 | u8 data, r, p, pll_q, pll_p = 1, pll_r = 1, pll_j = 1; |
| 769 | u16 pll_d = 1; | 769 | u16 pll_d = 1; |
| 770 | u8 reg; | ||
| 770 | 771 | ||
| 771 | /* select data word length */ | 772 | /* select data word length */ |
| 772 | data = | 773 | data = |
| @@ -801,8 +802,16 @@ static int aic3x_hw_params(struct snd_pcm_substream *substream, | |||
| 801 | pll_q &= 0xf; | 802 | pll_q &= 0xf; |
| 802 | aic3x_write(codec, AIC3X_PLL_PROGA_REG, pll_q << PLLQ_SHIFT); | 803 | aic3x_write(codec, AIC3X_PLL_PROGA_REG, pll_q << PLLQ_SHIFT); |
| 803 | aic3x_write(codec, AIC3X_GPIOB_REG, CODEC_CLKIN_CLKDIV); | 804 | aic3x_write(codec, AIC3X_GPIOB_REG, CODEC_CLKIN_CLKDIV); |
| 804 | } else | 805 | /* disable PLL if it is bypassed */ |
| 806 | reg = aic3x_read_reg_cache(codec, AIC3X_PLL_PROGA_REG); | ||
| 807 | aic3x_write(codec, AIC3X_PLL_PROGA_REG, reg & ~PLL_ENABLE); | ||
| 808 | |||
| 809 | } else { | ||
| 805 | aic3x_write(codec, AIC3X_GPIOB_REG, CODEC_CLKIN_PLLDIV); | 810 | aic3x_write(codec, AIC3X_GPIOB_REG, CODEC_CLKIN_PLLDIV); |
| 811 | /* enable PLL when it is used */ | ||
| 812 | reg = aic3x_read_reg_cache(codec, AIC3X_PLL_PROGA_REG); | ||
| 813 | aic3x_write(codec, AIC3X_PLL_PROGA_REG, reg | PLL_ENABLE); | ||
| 814 | } | ||
| 806 | 815 | ||
| 807 | /* Route Left DAC to left channel input and | 816 | /* Route Left DAC to left channel input and |
| 808 | * right DAC to right channel input */ | 817 | * right DAC to right channel input */ |
diff --git a/sound/usb/Kconfig b/sound/usb/Kconfig index 523aec188ccf..73525c048e7f 100644 --- a/sound/usb/Kconfig +++ b/sound/usb/Kconfig | |||
| @@ -48,6 +48,7 @@ config SND_USB_CAIAQ | |||
| 48 | * Native Instruments Kore Controller | 48 | * Native Instruments Kore Controller |
| 49 | * Native Instruments Kore Controller 2 | 49 | * Native Instruments Kore Controller 2 |
| 50 | * Native Instruments Audio Kontrol 1 | 50 | * Native Instruments Audio Kontrol 1 |
| 51 | * Native Instruments Audio 2 DJ | ||
| 51 | * Native Instruments Audio 4 DJ | 52 | * Native Instruments Audio 4 DJ |
| 52 | * Native Instruments Audio 8 DJ | 53 | * Native Instruments Audio 8 DJ |
| 53 | * Native Instruments Guitar Rig Session I/O | 54 | * Native Instruments Guitar Rig Session I/O |
diff --git a/sound/usb/caiaq/audio.c b/sound/usb/caiaq/audio.c index 8f9b60c5d74c..121af0644fd9 100644 --- a/sound/usb/caiaq/audio.c +++ b/sound/usb/caiaq/audio.c | |||
| @@ -646,6 +646,7 @@ int snd_usb_caiaq_audio_init(struct snd_usb_caiaqdev *dev) | |||
| 646 | case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_GUITARRIGMOBILE): | 646 | case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_GUITARRIGMOBILE): |
| 647 | dev->samplerates |= SNDRV_PCM_RATE_192000; | 647 | dev->samplerates |= SNDRV_PCM_RATE_192000; |
| 648 | /* fall thru */ | 648 | /* fall thru */ |
| 649 | case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO2DJ): | ||
| 649 | case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO4DJ): | 650 | case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO4DJ): |
| 650 | case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO8DJ): | 651 | case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO8DJ): |
| 651 | dev->samplerates |= SNDRV_PCM_RATE_88200; | 652 | dev->samplerates |= SNDRV_PCM_RATE_88200; |
diff --git a/sound/usb/caiaq/device.c b/sound/usb/caiaq/device.c index de38108f0b28..83e6c1312d47 100644 --- a/sound/usb/caiaq/device.c +++ b/sound/usb/caiaq/device.c | |||
| @@ -35,13 +35,14 @@ | |||
| 35 | #include "input.h" | 35 | #include "input.h" |
| 36 | 36 | ||
| 37 | MODULE_AUTHOR("Daniel Mack <daniel@caiaq.de>"); | 37 | MODULE_AUTHOR("Daniel Mack <daniel@caiaq.de>"); |
| 38 | MODULE_DESCRIPTION("caiaq USB audio, version 1.3.18"); | 38 | MODULE_DESCRIPTION("caiaq USB audio, version 1.3.19"); |
| 39 | MODULE_LICENSE("GPL"); | 39 | MODULE_LICENSE("GPL"); |
| 40 | MODULE_SUPPORTED_DEVICE("{{Native Instruments, RigKontrol2}," | 40 | MODULE_SUPPORTED_DEVICE("{{Native Instruments, RigKontrol2}," |
| 41 | "{Native Instruments, RigKontrol3}," | 41 | "{Native Instruments, RigKontrol3}," |
| 42 | "{Native Instruments, Kore Controller}," | 42 | "{Native Instruments, Kore Controller}," |
| 43 | "{Native Instruments, Kore Controller 2}," | 43 | "{Native Instruments, Kore Controller 2}," |
| 44 | "{Native Instruments, Audio Kontrol 1}," | 44 | "{Native Instruments, Audio Kontrol 1}," |
| 45 | "{Native Instruments, Audio 2 DJ}," | ||
| 45 | "{Native Instruments, Audio 4 DJ}," | 46 | "{Native Instruments, Audio 4 DJ}," |
| 46 | "{Native Instruments, Audio 8 DJ}," | 47 | "{Native Instruments, Audio 8 DJ}," |
| 47 | "{Native Instruments, Session I/O}," | 48 | "{Native Instruments, Session I/O}," |
| @@ -121,6 +122,11 @@ static struct usb_device_id snd_usb_id_table[] = { | |||
| 121 | .idVendor = USB_VID_NATIVEINSTRUMENTS, | 122 | .idVendor = USB_VID_NATIVEINSTRUMENTS, |
| 122 | .idProduct = USB_PID_AUDIO4DJ | 123 | .idProduct = USB_PID_AUDIO4DJ |
| 123 | }, | 124 | }, |
| 125 | { | ||
| 126 | .match_flags = USB_DEVICE_ID_MATCH_DEVICE, | ||
| 127 | .idVendor = USB_VID_NATIVEINSTRUMENTS, | ||
| 128 | .idProduct = USB_PID_AUDIO2DJ | ||
| 129 | }, | ||
| 124 | { /* terminator */ } | 130 | { /* terminator */ } |
| 125 | }; | 131 | }; |
| 126 | 132 | ||
diff --git a/sound/usb/caiaq/device.h b/sound/usb/caiaq/device.h index ece73514854e..44e3edf88bef 100644 --- a/sound/usb/caiaq/device.h +++ b/sound/usb/caiaq/device.h | |||
| @@ -10,6 +10,7 @@ | |||
| 10 | #define USB_PID_KORECONTROLLER 0x4711 | 10 | #define USB_PID_KORECONTROLLER 0x4711 |
| 11 | #define USB_PID_KORECONTROLLER2 0x4712 | 11 | #define USB_PID_KORECONTROLLER2 0x4712 |
| 12 | #define USB_PID_AK1 0x0815 | 12 | #define USB_PID_AK1 0x0815 |
| 13 | #define USB_PID_AUDIO2DJ 0x041c | ||
| 13 | #define USB_PID_AUDIO4DJ 0x0839 | 14 | #define USB_PID_AUDIO4DJ 0x0839 |
| 14 | #define USB_PID_AUDIO8DJ 0x1978 | 15 | #define USB_PID_AUDIO8DJ 0x1978 |
| 15 | #define USB_PID_SESSIONIO 0x1915 | 16 | #define USB_PID_SESSIONIO 0x1915 |
diff --git a/sound/usb/usbmixer.c b/sound/usb/usbmixer.c index 4bd3a7a0edc1..ec9cdf986928 100644 --- a/sound/usb/usbmixer.c +++ b/sound/usb/usbmixer.c | |||
| @@ -990,20 +990,35 @@ static void build_feature_ctl(struct mixer_build *state, unsigned char *desc, | |||
| 990 | break; | 990 | break; |
| 991 | } | 991 | } |
| 992 | 992 | ||
| 993 | /* quirk for UDA1321/N101 */ | 993 | /* volume control quirks */ |
| 994 | /* note that detection between firmware 2.1.1.7 (N101) and later 2.1.1.21 */ | ||
| 995 | /* is not very clear from datasheets */ | ||
| 996 | /* I hope that the min value is -15360 for newer firmware --jk */ | ||
| 997 | switch (state->chip->usb_id) { | 994 | switch (state->chip->usb_id) { |
| 998 | case USB_ID(0x0471, 0x0101): | 995 | case USB_ID(0x0471, 0x0101): |
| 999 | case USB_ID(0x0471, 0x0104): | 996 | case USB_ID(0x0471, 0x0104): |
| 1000 | case USB_ID(0x0471, 0x0105): | 997 | case USB_ID(0x0471, 0x0105): |
| 1001 | case USB_ID(0x0672, 0x1041): | 998 | case USB_ID(0x0672, 0x1041): |
| 999 | /* quirk for UDA1321/N101. | ||
| 1000 | * note that detection between firmware 2.1.1.7 (N101) | ||
| 1001 | * and later 2.1.1.21 is not very clear from datasheets. | ||
| 1002 | * I hope that the min value is -15360 for newer firmware --jk | ||
| 1003 | */ | ||
| 1002 | if (!strcmp(kctl->id.name, "PCM Playback Volume") && | 1004 | if (!strcmp(kctl->id.name, "PCM Playback Volume") && |
| 1003 | cval->min == -15616) { | 1005 | cval->min == -15616) { |
| 1004 | snd_printk(KERN_INFO "using volume control quirk for the UDA1321/N101 chip\n"); | 1006 | snd_printk(KERN_INFO |
| 1007 | "set volume quirk for UDA1321/N101 chip\n"); | ||
| 1005 | cval->max = -256; | 1008 | cval->max = -256; |
| 1006 | } | 1009 | } |
| 1010 | break; | ||
| 1011 | |||
| 1012 | case USB_ID(0x046d, 0x09a4): | ||
| 1013 | if (!strcmp(kctl->id.name, "Mic Capture Volume")) { | ||
| 1014 | snd_printk(KERN_INFO | ||
| 1015 | "set volume quirk for QuickCam E3500\n"); | ||
| 1016 | cval->min = 6080; | ||
| 1017 | cval->max = 8768; | ||
| 1018 | cval->res = 192; | ||
| 1019 | } | ||
| 1020 | break; | ||
| 1021 | |||
| 1007 | } | 1022 | } |
| 1008 | 1023 | ||
| 1009 | snd_printdd(KERN_INFO "[%d] FU [%s] ch = %d, val = %d/%d/%d\n", | 1024 | snd_printdd(KERN_INFO "[%d] FU [%s] ch = %d, val = %d/%d/%d\n", |
