diff options
Diffstat (limited to 'sound/usb/format.c')
| -rw-r--r-- | sound/usb/format.c | 30 | 
1 files changed, 19 insertions, 11 deletions
diff --git a/sound/usb/format.c b/sound/usb/format.c index e831ee4238b..99299ffb33a 100644 --- a/sound/usb/format.c +++ b/sound/usb/format.c @@ -43,11 +43,11 @@   */  static u64 parse_audio_format_i_type(struct snd_usb_audio *chip,  				     struct audioformat *fp, -				     int format, void *_fmt, +				     unsigned int format, void *_fmt,  				     int protocol)  {  	int sample_width, sample_bytes; -	u64 pcm_formats; +	u64 pcm_formats = 0;  	switch (protocol) {  	case UAC_VERSION_1: @@ -63,14 +63,17 @@ static u64 parse_audio_format_i_type(struct snd_usb_audio *chip,  		struct uac_format_type_i_ext_descriptor *fmt = _fmt;  		sample_width = fmt->bBitResolution;  		sample_bytes = fmt->bSubslotSize; + +		if (format & UAC2_FORMAT_TYPE_I_RAW_DATA) +			pcm_formats |= SNDRV_PCM_FMTBIT_SPECIAL; +  		format <<= 1;  		break;  	}  	} -	pcm_formats = 0; - -	if (format == 0 || format == (1 << UAC_FORMAT_TYPE_I_UNDEFINED)) { +	if ((pcm_formats == 0) && +	    (format == 0 || format == (1 << UAC_FORMAT_TYPE_I_UNDEFINED))) {  		/* some devices don't define this correctly... */  		snd_printdd(KERN_INFO "%d:%u:%d : format type 0 is detected, processed as PCM\n",  			    chip->dev->devnum, fp->iface, fp->altsetting); @@ -133,6 +136,9 @@ static u64 parse_audio_format_i_type(struct snd_usb_audio *chip,  		snd_printk(KERN_INFO "%d:%u:%d : unsupported format bits %#x\n",  			   chip->dev->devnum, fp->iface, fp->altsetting, format);  	} + +	pcm_formats |= snd_usb_interface_dsd_format_quirks(chip, fp, sample_bytes); +  	return pcm_formats;  } @@ -277,7 +283,7 @@ static int parse_audio_format_rates_v2(struct snd_usb_audio *chip,  	struct usb_device *dev = chip->dev;  	unsigned char tmp[2], *data;  	int nr_triplets, data_size, ret = 0; -	int clock = snd_usb_clock_find_source(chip, fp->clock); +	int clock = snd_usb_clock_find_source(chip, fp->clock, false);  	if (clock < 0) {  		snd_printk(KERN_ERR "%s(): unable to find clock source (clock %d)\n", @@ -353,13 +359,14 @@ err:   * parse the format type I and III descriptors   */  static int parse_audio_format_i(struct snd_usb_audio *chip, -				struct audioformat *fp, int format, +				struct audioformat *fp, unsigned int format,  				struct uac_format_type_i_continuous_descriptor *fmt,  				struct usb_host_interface *iface)  {  	struct usb_interface_descriptor *altsd = get_iface_desc(iface);  	int protocol = altsd->bInterfaceProtocol; -	int pcm_format, ret; +	snd_pcm_format_t pcm_format; +	int ret;  	if (fmt->bFormatType == UAC_FORMAT_TYPE_III) {  		/* FIXME: the format type is really IECxxx @@ -378,7 +385,7 @@ static int parse_audio_format_i(struct snd_usb_audio *chip,  		default:  			pcm_format = SNDRV_PCM_FORMAT_S16_LE;  		} -		fp->formats = 1uLL << pcm_format; +		fp->formats = pcm_format_to_bits(pcm_format);  	} else {  		fp->formats = parse_audio_format_i_type(chip, fp, format,  							fmt, protocol); @@ -473,8 +480,9 @@ static int parse_audio_format_ii(struct snd_usb_audio *chip,  	return ret;  } -int snd_usb_parse_audio_format(struct snd_usb_audio *chip, struct audioformat *fp, -			       int format, struct uac_format_type_i_continuous_descriptor *fmt, +int snd_usb_parse_audio_format(struct snd_usb_audio *chip, +			       struct audioformat *fp, unsigned int format, +			       struct uac_format_type_i_continuous_descriptor *fmt,  			       int stream, struct usb_host_interface *iface)  {  	int err;  |