Commit 640f7ad7 authored by Jaroslav Kysela's avatar Jaroslav Kysela

ALSA CVS update - Clemens Ladisch <clemens@ladisch.de>

USB generic driver
replace usage of interface index with calls to usb_ifnum_to_if
parent 996d3ec6
...@@ -1082,7 +1082,8 @@ static int set_format(snd_usb_substream_t *subs, struct audioformat *fmt) ...@@ -1082,7 +1082,8 @@ static int set_format(snd_usb_substream_t *subs, struct audioformat *fmt)
int is_playback = subs->direction == SNDRV_PCM_STREAM_PLAYBACK; int is_playback = subs->direction == SNDRV_PCM_STREAM_PLAYBACK;
int err; int err;
iface = get_iface(config, fmt->iface); iface = usb_ifnum_to_if(dev, fmt->iface);
snd_assert(iface, return -EINVAL);
alts = &iface->altsetting[fmt->altset_idx]; alts = &iface->altsetting[fmt->altset_idx];
altsd = get_iface_desc(alts); altsd = get_iface_desc(alts);
snd_assert(altsd->bAlternateSetting == fmt->altsetting, return -EINVAL); snd_assert(altsd->bAlternateSetting == fmt->altsetting, return -EINVAL);
...@@ -1213,10 +1214,9 @@ static int snd_usb_hw_params(snd_pcm_substream_t *substream, ...@@ -1213,10 +1214,9 @@ static int snd_usb_hw_params(snd_pcm_substream_t *substream,
return ret; return ret;
if (subs->cur_rate != rate) { if (subs->cur_rate != rate) {
struct usb_host_config *config = subs->dev->actconfig;
struct usb_host_interface *alts; struct usb_host_interface *alts;
struct usb_interface *iface; struct usb_interface *iface;
iface = get_iface(config, fmt->iface); iface = usb_ifnum_to_if(subs->dev, fmt->iface);
alts = &iface->altsetting[fmt->altset_idx]; alts = &iface->altsetting[fmt->altset_idx];
ret = init_usb_sample_rate(subs->dev, subs->interface, alts, fmt, rate); ret = init_usb_sample_rate(subs->dev, subs->interface, alts, fmt, rate);
if (ret < 0) if (ret < 0)
...@@ -2269,7 +2269,6 @@ static int parse_audio_format(struct usb_device *dev, struct audioformat *fp, ...@@ -2269,7 +2269,6 @@ static int parse_audio_format(struct usb_device *dev, struct audioformat *fp,
static int parse_audio_endpoints(snd_usb_audio_t *chip, int iface_no) static int parse_audio_endpoints(snd_usb_audio_t *chip, int iface_no)
{ {
struct usb_device *dev; struct usb_device *dev;
struct usb_host_config *config;
struct usb_interface *iface; struct usb_interface *iface;
struct usb_host_interface *alts; struct usb_host_interface *alts;
struct usb_interface_descriptor *altsd; struct usb_interface_descriptor *altsd;
...@@ -2279,10 +2278,9 @@ static int parse_audio_endpoints(snd_usb_audio_t *chip, int iface_no) ...@@ -2279,10 +2278,9 @@ static int parse_audio_endpoints(snd_usb_audio_t *chip, int iface_no)
unsigned char *fmt, *csep; unsigned char *fmt, *csep;
dev = chip->dev; dev = chip->dev;
config = dev->actconfig;
/* parse the interface's altsettings */ /* parse the interface's altsettings */
iface = get_iface(config, iface_no); iface = usb_ifnum_to_if(dev, iface_no);
for (i = 0; i < iface->num_altsetting; i++) { for (i = 0; i < iface->num_altsetting; i++) {
alts = &iface->altsetting[i]; alts = &iface->altsetting[i];
altsd = get_iface_desc(alts); altsd = get_iface_desc(alts);
...@@ -2448,15 +2446,13 @@ static void snd_usb_stream_disconnect(struct list_head *head, struct usb_driver ...@@ -2448,15 +2446,13 @@ static void snd_usb_stream_disconnect(struct list_head *head, struct usb_driver
static int snd_usb_create_streams(snd_usb_audio_t *chip, int ctrlif) static int snd_usb_create_streams(snd_usb_audio_t *chip, int ctrlif)
{ {
struct usb_device *dev = chip->dev; struct usb_device *dev = chip->dev;
struct usb_host_config *config;
struct usb_host_interface *host_iface; struct usb_host_interface *host_iface;
struct usb_interface *iface; struct usb_interface *iface;
unsigned char *p1; unsigned char *p1;
int i, j; int i, j;
/* find audiocontrol interface */ /* find audiocontrol interface */
config = dev->actconfig; host_iface = &usb_ifnum_to_if(dev, ctrlif)->altsetting[0];
host_iface = &get_iface(config, ctrlif)->altsetting[0];
if (!(p1 = snd_usb_find_csint_desc(host_iface->extra, host_iface->extralen, NULL, HEADER))) { if (!(p1 = snd_usb_find_csint_desc(host_iface->extra, host_iface->extralen, NULL, HEADER))) {
snd_printk(KERN_ERR "cannot find HEADER\n"); snd_printk(KERN_ERR "cannot find HEADER\n");
return -EINVAL; return -EINVAL;
...@@ -2473,12 +2469,12 @@ static int snd_usb_create_streams(snd_usb_audio_t *chip, int ctrlif) ...@@ -2473,12 +2469,12 @@ static int snd_usb_create_streams(snd_usb_audio_t *chip, int ctrlif)
struct usb_host_interface *alts; struct usb_host_interface *alts;
struct usb_interface_descriptor *altsd; struct usb_interface_descriptor *altsd;
j = p1[8 + i]; j = p1[8 + i];
if (j >= get_cfg_desc(config)->bNumInterfaces) { iface = usb_ifnum_to_if(dev, j);
if (!iface) {
snd_printk(KERN_ERR "%d:%u:%d : does not exist\n", snd_printk(KERN_ERR "%d:%u:%d : does not exist\n",
dev->devnum, ctrlif, j); dev->devnum, ctrlif, j);
continue; continue;
} }
iface = get_iface(config, j);
if (usb_interface_claimed(iface)) { if (usb_interface_claimed(iface)) {
snd_printdd(KERN_INFO "%d:%d:%d: skipping, already claimed\n", dev->devnum, ctrlif, j); snd_printdd(KERN_INFO "%d:%d:%d: skipping, already claimed\n", dev->devnum, ctrlif, j);
continue; continue;
...@@ -2535,6 +2531,11 @@ static int create_fixed_stream_quirk(snd_usb_audio_t *chip, ...@@ -2535,6 +2531,11 @@ static int create_fixed_stream_quirk(snd_usb_audio_t *chip,
kfree(fp); kfree(fp);
return err; return err;
} }
if (fp->iface != get_iface_desc(&iface->altsetting[0])->bInterfaceNumber ||
fp->altset_idx >= iface->num_altsetting) {
kfree(fp);
return -EINVAL;
}
alts = &iface->altsetting[fp->altset_idx]; alts = &iface->altsetting[fp->altset_idx];
usb_set_interface(chip->dev, fp->iface, 0); usb_set_interface(chip->dev, fp->iface, 0);
init_usb_pitch(chip->dev, fp->iface, alts, fp); init_usb_pitch(chip->dev, fp->iface, alts, fp);
......
...@@ -207,7 +207,6 @@ void snd_usbmidi_disconnect(struct list_head *p, struct usb_driver *driver); ...@@ -207,7 +207,6 @@ void snd_usbmidi_disconnect(struct list_head *p, struct usb_driver *driver);
* (conditional for compatibility with the older API) * (conditional for compatibility with the older API)
*/ */
#ifndef get_iface_desc #ifndef get_iface_desc
#define get_iface(cfg, num) ((cfg)->interface[(num)])
#define get_iface_desc(iface) (&(iface)->desc) #define get_iface_desc(iface) (&(iface)->desc)
#define get_endpoint(alt,ep) (&(alt)->endpoint[ep].desc) #define get_endpoint(alt,ep) (&(alt)->endpoint[ep].desc)
#define get_ep_desc(ep) (&(ep)->desc) #define get_ep_desc(ep) (&(ep)->desc)
......
...@@ -1481,7 +1481,7 @@ int snd_usb_create_mixer(snd_usb_audio_t *chip, int ctrlif) ...@@ -1481,7 +1481,7 @@ int snd_usb_create_mixer(snd_usb_audio_t *chip, int ctrlif)
int err; int err;
const struct usbmix_ctl_map *map; const struct usbmix_ctl_map *map;
struct usb_device_descriptor *dev = &chip->dev->descriptor; struct usb_device_descriptor *dev = &chip->dev->descriptor;
struct usb_host_interface *hostif = &get_iface(chip->dev->actconfig, ctrlif)->altsetting[0]; struct usb_host_interface *hostif = &usb_ifnum_to_if(chip->dev, ctrlif)->altsetting[0];
strcpy(chip->card->mixername, "USB Mixer"); strcpy(chip->card->mixername, "USB Mixer");
......
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