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

Pull sound fixes from Takashi Iwai:
"Containing the regression fixes for USB-audio due to the transition to
the new streaming logic, mostly found on Logitech webcams."

* tag 'sound-3.5' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound:
ALSA: snd-usb: move calls to usb_set_interface
ALSA: usb-audio: Fix the first PCM interface assignment

Changed files
+43 -91
sound
+6 -67
sound/usb/endpoint.c
··· 414 414 { 415 415 struct list_head *p; 416 416 struct snd_usb_endpoint *ep; 417 - int ret, is_playback = direction == SNDRV_PCM_STREAM_PLAYBACK; 417 + int is_playback = direction == SNDRV_PCM_STREAM_PLAYBACK; 418 418 419 419 mutex_lock(&chip->mutex); 420 420 ··· 433 433 is_playback ? "playback" : "capture", 434 434 type == SND_USB_ENDPOINT_TYPE_DATA ? "data" : "sync", 435 435 ep_num); 436 - 437 - /* select the alt setting once so the endpoints become valid */ 438 - ret = usb_set_interface(chip->dev, alts->desc.bInterfaceNumber, 439 - alts->desc.bAlternateSetting); 440 - if (ret < 0) { 441 - snd_printk(KERN_ERR "%s(): usb_set_interface() failed, ret = %d\n", 442 - __func__, ret); 443 - ep = NULL; 444 - goto __exit_unlock; 445 - } 446 436 447 437 ep = kzalloc(sizeof(*ep), GFP_KERNEL); 448 438 if (!ep) ··· 821 831 if (++ep->use_count != 1) 822 832 return 0; 823 833 824 - if (snd_BUG_ON(!test_bit(EP_FLAG_ACTIVATED, &ep->flags))) 825 - return -EINVAL; 826 - 827 834 /* just to be sure */ 828 835 deactivate_urbs(ep, 0, 1); 829 836 wait_clear_urbs(ep); ··· 898 911 if (snd_BUG_ON(ep->use_count == 0)) 899 912 return; 900 913 901 - if (snd_BUG_ON(!test_bit(EP_FLAG_ACTIVATED, &ep->flags))) 902 - return; 903 - 904 914 if (--ep->use_count == 0) { 905 915 deactivate_urbs(ep, force, can_sleep); 906 916 ep->data_subs = NULL; ··· 908 924 if (wait) 909 925 wait_clear_urbs(ep); 910 926 } 911 - } 912 - 913 - /** 914 - * snd_usb_endpoint_activate: activate an snd_usb_endpoint 915 - * 916 - * @ep: the endpoint to activate 917 - * 918 - * If the endpoint is not currently in use, this functions will select the 919 - * correct alternate interface setting for the interface of this endpoint. 920 - * 921 - * In case of any active users, this functions does nothing. 922 - * 923 - * Returns an error if usb_set_interface() failed, 0 in all other 924 - * cases. 925 - */ 926 - int snd_usb_endpoint_activate(struct snd_usb_endpoint *ep) 927 - { 928 - if (ep->use_count != 0) 929 - return 0; 930 - 931 - if (!ep->chip->shutdown && 932 - !test_and_set_bit(EP_FLAG_ACTIVATED, &ep->flags)) { 933 - int ret; 934 - 935 - ret = usb_set_interface(ep->chip->dev, ep->iface, ep->alt_idx); 936 - if (ret < 0) { 937 - snd_printk(KERN_ERR "%s() usb_set_interface() failed, ret = %d\n", 938 - __func__, ret); 939 - clear_bit(EP_FLAG_ACTIVATED, &ep->flags); 940 - return ret; 941 - } 942 - 943 - return 0; 944 - } 945 - 946 - return -EBUSY; 947 927 } 948 928 949 929 /** ··· 928 980 if (!ep) 929 981 return -EINVAL; 930 982 983 + deactivate_urbs(ep, 1, 1); 984 + wait_clear_urbs(ep); 985 + 931 986 if (ep->use_count != 0) 932 987 return 0; 933 988 934 - if (!ep->chip->shutdown && 935 - test_and_clear_bit(EP_FLAG_ACTIVATED, &ep->flags)) { 936 - int ret; 989 + clear_bit(EP_FLAG_ACTIVATED, &ep->flags); 937 990 938 - ret = usb_set_interface(ep->chip->dev, ep->iface, 0); 939 - if (ret < 0) { 940 - snd_printk(KERN_ERR "%s(): usb_set_interface() failed, ret = %d\n", 941 - __func__, ret); 942 - return ret; 943 - } 944 - 945 - return 0; 946 - } 947 - 948 - return -EBUSY; 991 + return 0; 949 992 } 950 993 951 994 /**
+37 -24
sound/usb/pcm.c
··· 261 261 force, can_sleep, wait); 262 262 } 263 263 264 - static int activate_endpoints(struct snd_usb_substream *subs) 265 - { 266 - if (subs->sync_endpoint) { 267 - int ret; 268 - 269 - ret = snd_usb_endpoint_activate(subs->sync_endpoint); 270 - if (ret < 0) 271 - return ret; 272 - } 273 - 274 - return snd_usb_endpoint_activate(subs->data_endpoint); 275 - } 276 - 277 264 static int deactivate_endpoints(struct snd_usb_substream *subs) 278 265 { 279 266 int reta, retb; ··· 300 313 301 314 if (fmt == subs->cur_audiofmt) 302 315 return 0; 316 + 317 + /* close the old interface */ 318 + if (subs->interface >= 0 && subs->interface != fmt->iface) { 319 + err = usb_set_interface(subs->dev, subs->interface, 0); 320 + if (err < 0) { 321 + snd_printk(KERN_ERR "%d:%d:%d: return to setting 0 failed (%d)\n", 322 + dev->devnum, fmt->iface, fmt->altsetting, err); 323 + return -EIO; 324 + } 325 + subs->interface = -1; 326 + subs->altset_idx = 0; 327 + } 328 + 329 + /* set interface */ 330 + if (subs->interface != fmt->iface || 331 + subs->altset_idx != fmt->altset_idx) { 332 + err = usb_set_interface(dev, fmt->iface, fmt->altsetting); 333 + if (err < 0) { 334 + snd_printk(KERN_ERR "%d:%d:%d: usb_set_interface failed (%d)\n", 335 + dev->devnum, fmt->iface, fmt->altsetting, err); 336 + return -EIO; 337 + } 338 + snd_printdd(KERN_INFO "setting usb interface %d:%d\n", 339 + fmt->iface, fmt->altsetting); 340 + subs->interface = fmt->iface; 341 + subs->altset_idx = fmt->altset_idx; 342 + } 303 343 304 344 subs->data_endpoint = snd_usb_add_endpoint(subs->stream->chip, 305 345 alts, fmt->endpoint, subs->direction, ··· 401 387 subs->data_endpoint->sync_master = subs->sync_endpoint; 402 388 } 403 389 404 - if ((err = snd_usb_init_pitch(subs->stream->chip, subs->interface, alts, fmt)) < 0) 390 + if ((err = snd_usb_init_pitch(subs->stream->chip, fmt->iface, alts, fmt)) < 0) 405 391 return err; 406 392 407 393 subs->cur_audiofmt = fmt; ··· 464 450 struct usb_interface *iface; 465 451 iface = usb_ifnum_to_if(subs->dev, fmt->iface); 466 452 alts = &iface->altsetting[fmt->altset_idx]; 467 - ret = snd_usb_init_sample_rate(subs->stream->chip, subs->interface, alts, fmt, rate); 453 + ret = snd_usb_init_sample_rate(subs->stream->chip, fmt->iface, alts, fmt, rate); 468 454 if (ret < 0) 469 455 return ret; 470 456 subs->cur_rate = rate; ··· 474 460 mutex_lock(&subs->stream->chip->shutdown_mutex); 475 461 /* format changed */ 476 462 stop_endpoints(subs, 0, 0, 0); 477 - deactivate_endpoints(subs); 478 - 479 - ret = activate_endpoints(subs); 480 - if (ret < 0) 481 - goto unlock; 482 - 483 463 ret = snd_usb_endpoint_set_params(subs->data_endpoint, hw_params, fmt, 484 464 subs->sync_endpoint); 485 465 if (ret < 0) ··· 508 500 subs->period_bytes = 0; 509 501 mutex_lock(&subs->stream->chip->shutdown_mutex); 510 502 stop_endpoints(subs, 0, 1, 1); 503 + deactivate_endpoints(subs); 511 504 mutex_unlock(&subs->stream->chip->shutdown_mutex); 512 505 return snd_pcm_lib_free_vmalloc_buffer(substream); 513 506 } ··· 947 938 948 939 static int snd_usb_pcm_close(struct snd_pcm_substream *substream, int direction) 949 940 { 950 - int ret; 951 941 struct snd_usb_stream *as = snd_pcm_substream_chip(substream); 952 942 struct snd_usb_substream *subs = &as->substream[direction]; 953 943 954 944 stop_endpoints(subs, 0, 0, 0); 955 - ret = deactivate_endpoints(subs); 945 + 946 + if (!as->chip->shutdown && subs->interface >= 0) { 947 + usb_set_interface(subs->dev, subs->interface, 0); 948 + subs->interface = -1; 949 + } 950 + 956 951 subs->pcm_substream = NULL; 957 952 snd_usb_autosuspend(subs->stream->chip); 958 953 959 - return ret; 954 + return 0; 960 955 } 961 956 962 957 /* Since a URB can handle only a single linear buffer, we must use double