diff options
| -rw-r--r-- | sound/usb/format.c | 3 | ||||
| -rw-r--r-- | sound/usb/quirks.c | 28 | ||||
| -rw-r--r-- | sound/usb/quirks.h | 4 | 
3 files changed, 35 insertions, 0 deletions
diff --git a/sound/usb/format.c b/sound/usb/format.c index 20c77517095..020ede0259e 100644 --- a/sound/usb/format.c +++ b/sound/usb/format.c @@ -136,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;  } diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c index 175fbb7d334..e564adb7485 100644 --- a/sound/usb/quirks.c +++ b/sound/usb/quirks.c @@ -916,3 +916,31 @@ void snd_usb_ctl_msg_quirk(struct usb_device *dev, unsigned int pipe,  		mdelay(20);  } +/* + * snd_usb_interface_dsd_format_quirks() is called from format.c to + * augment the PCM format bit-field for DSD types. The UAC standards + * don't have a designated bit field to denote DSD-capable interfaces, + * hence all hardware that is known to support this format has to be + * listed here. + */ +u64 snd_usb_interface_dsd_format_quirks(struct snd_usb_audio *chip, +					struct audioformat *fp, +					unsigned int sample_bytes) +{ +	/* Playback Designs */ +	if (le16_to_cpu(chip->dev->descriptor.idVendor) == 0x23ba) { +		switch (fp->altsetting) { +		case 1: +			fp->dsd_dop = true; +			return SNDRV_PCM_FMTBIT_DSD_U16_LE; +		case 2: +			fp->dsd_bitrev = true; +			return SNDRV_PCM_FMTBIT_DSD_U8; +		case 3: +			fp->dsd_bitrev = true; +			return SNDRV_PCM_FMTBIT_DSD_U16_LE; +		} +	} + +	return 0; +} diff --git a/sound/usb/quirks.h b/sound/usb/quirks.h index 7c3681fd1c3..665e972a1b4 100644 --- a/sound/usb/quirks.h +++ b/sound/usb/quirks.h @@ -31,4 +31,8 @@ void snd_usb_ctl_msg_quirk(struct usb_device *dev, unsigned int pipe,  			   __u8 request, __u8 requesttype, __u16 value,  			   __u16 index, void *data, __u16 size); +u64 snd_usb_interface_dsd_format_quirks(struct snd_usb_audio *chip, +					struct audioformat *fp, +					unsigned int sample_bytes); +  #endif /* __USBAUDIO_QUIRKS_H */  |