diff options
Diffstat (limited to 'sound/usb')
-rw-r--r-- | sound/usb/usbaudio.c | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c index b7fa0b0b713d..3f974a64c55e 100644 --- a/sound/usb/usbaudio.c +++ b/sound/usb/usbaudio.c | |||
@@ -121,6 +121,7 @@ struct audioformat { | |||
121 | unsigned char attributes; /* corresponding attributes of cs endpoint */ | 121 | unsigned char attributes; /* corresponding attributes of cs endpoint */ |
122 | unsigned char endpoint; /* endpoint */ | 122 | unsigned char endpoint; /* endpoint */ |
123 | unsigned char ep_attr; /* endpoint attributes */ | 123 | unsigned char ep_attr; /* endpoint attributes */ |
124 | unsigned char datainterval; /* log_2 of data packet interval */ | ||
124 | unsigned int maxpacksize; /* max. packet size */ | 125 | unsigned int maxpacksize; /* max. packet size */ |
125 | unsigned int rates; /* rate bitmasks */ | 126 | unsigned int rates; /* rate bitmasks */ |
126 | unsigned int rate_min, rate_max; /* min/max rates */ | 127 | unsigned int rate_min, rate_max; /* min/max rates */ |
@@ -1350,12 +1351,7 @@ static int set_format(struct snd_usb_substream *subs, struct audioformat *fmt) | |||
1350 | subs->datapipe = usb_sndisocpipe(dev, ep); | 1351 | subs->datapipe = usb_sndisocpipe(dev, ep); |
1351 | else | 1352 | else |
1352 | subs->datapipe = usb_rcvisocpipe(dev, ep); | 1353 | subs->datapipe = usb_rcvisocpipe(dev, ep); |
1353 | if (snd_usb_get_speed(subs->dev) == USB_SPEED_HIGH && | 1354 | subs->datainterval = fmt->datainterval; |
1354 | get_endpoint(alts, 0)->bInterval >= 1 && | ||
1355 | get_endpoint(alts, 0)->bInterval <= 4) | ||
1356 | subs->datainterval = get_endpoint(alts, 0)->bInterval - 1; | ||
1357 | else | ||
1358 | subs->datainterval = 0; | ||
1359 | subs->syncpipe = subs->syncinterval = 0; | 1355 | subs->syncpipe = subs->syncinterval = 0; |
1360 | subs->maxpacksize = fmt->maxpacksize; | 1356 | subs->maxpacksize = fmt->maxpacksize; |
1361 | subs->fill_max = 0; | 1357 | subs->fill_max = 0; |
@@ -2070,6 +2066,9 @@ static void proc_dump_substream_formats(struct snd_usb_substream *subs, struct s | |||
2070 | } | 2066 | } |
2071 | snd_iprintf(buffer, "\n"); | 2067 | snd_iprintf(buffer, "\n"); |
2072 | } | 2068 | } |
2069 | if (snd_usb_get_speed(subs->dev) == USB_SPEED_HIGH) | ||
2070 | snd_iprintf(buffer, " Data packet interval: %d us\n", | ||
2071 | 125 * (1 << fp->datainterval)); | ||
2073 | // snd_iprintf(buffer, " Max Packet Size = %d\n", fp->maxpacksize); | 2072 | // snd_iprintf(buffer, " Max Packet Size = %d\n", fp->maxpacksize); |
2074 | // snd_iprintf(buffer, " EP Attribute = %#x\n", fp->attributes); | 2073 | // snd_iprintf(buffer, " EP Attribute = %#x\n", fp->attributes); |
2075 | } | 2074 | } |
@@ -2563,6 +2562,17 @@ static int parse_audio_format(struct snd_usb_audio *chip, struct audioformat *fp | |||
2563 | return 0; | 2562 | return 0; |
2564 | } | 2563 | } |
2565 | 2564 | ||
2565 | static unsigned char parse_datainterval(struct snd_usb_audio *chip, | ||
2566 | struct usb_host_interface *alts) | ||
2567 | { | ||
2568 | if (snd_usb_get_speed(chip->dev) == USB_SPEED_HIGH && | ||
2569 | get_endpoint(alts, 0)->bInterval >= 1 && | ||
2570 | get_endpoint(alts, 0)->bInterval <= 4) | ||
2571 | return get_endpoint(alts, 0)->bInterval - 1; | ||
2572 | else | ||
2573 | return 0; | ||
2574 | } | ||
2575 | |||
2566 | static int audiophile_skip_setting_quirk(struct snd_usb_audio *chip, | 2576 | static int audiophile_skip_setting_quirk(struct snd_usb_audio *chip, |
2567 | int iface, int altno); | 2577 | int iface, int altno); |
2568 | static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no) | 2578 | static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no) |
@@ -2668,6 +2678,7 @@ static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no) | |||
2668 | fp->altset_idx = i; | 2678 | fp->altset_idx = i; |
2669 | fp->endpoint = get_endpoint(alts, 0)->bEndpointAddress; | 2679 | fp->endpoint = get_endpoint(alts, 0)->bEndpointAddress; |
2670 | fp->ep_attr = get_endpoint(alts, 0)->bmAttributes; | 2680 | fp->ep_attr = get_endpoint(alts, 0)->bmAttributes; |
2681 | fp->datainterval = parse_datainterval(chip, alts); | ||
2671 | fp->maxpacksize = le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize); | 2682 | fp->maxpacksize = le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize); |
2672 | if (snd_usb_get_speed(dev) == USB_SPEED_HIGH) | 2683 | if (snd_usb_get_speed(dev) == USB_SPEED_HIGH) |
2673 | fp->maxpacksize = (((fp->maxpacksize >> 11) & 3) + 1) | 2684 | fp->maxpacksize = (((fp->maxpacksize >> 11) & 3) + 1) |
@@ -2859,6 +2870,7 @@ static int create_fixed_stream_quirk(struct snd_usb_audio *chip, | |||
2859 | return -EINVAL; | 2870 | return -EINVAL; |
2860 | } | 2871 | } |
2861 | alts = &iface->altsetting[fp->altset_idx]; | 2872 | alts = &iface->altsetting[fp->altset_idx]; |
2873 | fp->datainterval = parse_datainterval(chip, alts); | ||
2862 | fp->maxpacksize = le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize); | 2874 | fp->maxpacksize = le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize); |
2863 | usb_set_interface(chip->dev, fp->iface, 0); | 2875 | usb_set_interface(chip->dev, fp->iface, 0); |
2864 | init_usb_pitch(chip->dev, fp->iface, alts, fp); | 2876 | init_usb_pitch(chip->dev, fp->iface, alts, fp); |
@@ -2953,6 +2965,7 @@ static int create_uaxx_quirk(struct snd_usb_audio *chip, | |||
2953 | fp->iface = altsd->bInterfaceNumber; | 2965 | fp->iface = altsd->bInterfaceNumber; |
2954 | fp->endpoint = get_endpoint(alts, 0)->bEndpointAddress; | 2966 | fp->endpoint = get_endpoint(alts, 0)->bEndpointAddress; |
2955 | fp->ep_attr = get_endpoint(alts, 0)->bmAttributes; | 2967 | fp->ep_attr = get_endpoint(alts, 0)->bmAttributes; |
2968 | fp->datainterval = 0; | ||
2956 | fp->maxpacksize = le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize); | 2969 | fp->maxpacksize = le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize); |
2957 | 2970 | ||
2958 | switch (fp->maxpacksize) { | 2971 | switch (fp->maxpacksize) { |
@@ -3020,6 +3033,7 @@ static int create_ua1000_quirk(struct snd_usb_audio *chip, | |||
3020 | fp->iface = altsd->bInterfaceNumber; | 3033 | fp->iface = altsd->bInterfaceNumber; |
3021 | fp->endpoint = get_endpoint(alts, 0)->bEndpointAddress; | 3034 | fp->endpoint = get_endpoint(alts, 0)->bEndpointAddress; |
3022 | fp->ep_attr = get_endpoint(alts, 0)->bmAttributes; | 3035 | fp->ep_attr = get_endpoint(alts, 0)->bmAttributes; |
3036 | fp->datainterval = parse_datainterval(chip, alts); | ||
3023 | fp->maxpacksize = le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize); | 3037 | fp->maxpacksize = le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize); |
3024 | fp->rate_max = fp->rate_min = combine_triple(&alts->extra[8]); | 3038 | fp->rate_max = fp->rate_min = combine_triple(&alts->extra[8]); |
3025 | 3039 | ||
@@ -3072,6 +3086,7 @@ static int create_ua101_quirk(struct snd_usb_audio *chip, | |||
3072 | fp->iface = altsd->bInterfaceNumber; | 3086 | fp->iface = altsd->bInterfaceNumber; |
3073 | fp->endpoint = get_endpoint(alts, 0)->bEndpointAddress; | 3087 | fp->endpoint = get_endpoint(alts, 0)->bEndpointAddress; |
3074 | fp->ep_attr = get_endpoint(alts, 0)->bmAttributes; | 3088 | fp->ep_attr = get_endpoint(alts, 0)->bmAttributes; |
3089 | fp->datainterval = parse_datainterval(chip, alts); | ||
3075 | fp->maxpacksize = le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize); | 3090 | fp->maxpacksize = le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize); |
3076 | fp->rate_max = fp->rate_min = combine_triple(&alts->extra[15]); | 3091 | fp->rate_max = fp->rate_min = combine_triple(&alts->extra[15]); |
3077 | 3092 | ||