Commit eaf6cbe0 authored by Ruslan Bilovol's avatar Ruslan Bilovol Committed by Greg Kroah-Hartman
Browse files

usb: gadget: f_uac2: add volume and mute support



This adds bi-directional (host->device, device->host)
volume/mute support to the f_uac2 driver by adding
Feature Units and interrupt endpoint.

Currently only master channel is supported.

Volume and mute are configurable through configfs,
by default volume has -100..0 dB range with 1 dB step.

Similar to existing flexible endpoints configuration,
Feature Unit won't be added to the topology if both
mute and volume are not enabled, also interrupt endpoint
isn't added to the device if no feature unit is present

Signed-off-by: default avatarRuslan Bilovol <ruslan.bilovol@gmail.com>
Signed-off-by: default avatarPavel Hofman <pavel.hofman@ivitera.com>
Link: https://lore.kernel.org/r/20210712125529.76070-4-pavel.hofman@ivitera.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 02de698c
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -9,8 +9,18 @@ Description:
		c_srate    capture sampling rate
		c_ssize    capture sample size (bytes)
		c_sync     capture synchronization type (async/adaptive)
		c_mute_present	capture mute control enable
		c_volume_present	capture volume control enable
		c_volume_min	capture volume control min value (in 1/256 dB)
		c_volume_max	capture volume control max value (in 1/256 dB)
		c_volume_res	capture volume control resolution (in 1/256 dB)
		fb_max     maximum extra bandwidth in async mode
		p_chmask   playback channel mask
		p_srate    playback sampling rate
		p_ssize    playback sample size (bytes)
		p_mute_present	playback mute control enable
		p_volume_present	playback volume control enable
		p_volume_min	playback volume control min value (in 1/256 dB)
		p_volume_max	playback volume control max value (in 1/256 dB)
		p_volume_res	playback volume control resolution (in 1/256 dB)
		=========  ============================
+11 −1
Original line number Diff line number Diff line
@@ -729,10 +729,20 @@ The uac2 function provides these attributes in its function directory:
	c_srate		capture sampling rate
	c_ssize		capture sample size (bytes)
	c_sync		capture synchronization type (async/adaptive)
	c_mute_present	capture mute control enable
	c_volume_present	capture volume control enable
	c_volume_min	capture volume control min value (in 1/256 dB)
	c_volume_max	capture volume control max value (in 1/256 dB)
	c_volume_res	capture volume control resolution (in 1/256 dB)
	fb_max    maximum extra bandwidth in async mode
	p_chmask	playback channel mask
	p_srate		playback sampling rate
	p_ssize		playback sample size (bytes)
	p_mute_present	playback mute control enable
	p_volume_present	playback volume control enable
	p_volume_min	playback volume control min value (in 1/256 dB)
	p_volume_max	playback volume control max value (in 1/256 dB)
	p_volume_res	playback volume control resolution (in 1/256 dB)
	req_number	the number of pre-allocated request for both capture
			and playback
	=============== ====================================================
+595 −61

File changed.

Preview size limit exceeded, changes collapsed.

+22 −1
Original line number Diff line number Diff line
@@ -22,8 +22,16 @@
#define UAC2_DEF_CSRATE 64000
#define UAC2_DEF_CSSIZE 2
#define UAC2_DEF_CSYNC		USB_ENDPOINT_SYNC_ASYNC

#define UAC2_DEF_MUTE_PRESENT	1
#define UAC2_DEF_VOLUME_PRESENT 1
#define UAC2_DEF_MIN_DB		(-100*256)	/* -100 dB */
#define UAC2_DEF_MAX_DB		0		/* 0 dB */
#define UAC2_DEF_RES_DB		(1*256)		/* 1 dB */

#define UAC2_DEF_REQ_NUM 2
#define UAC2_DEF_FB_MAX 5
#define UAC2_DEF_INT_REQ_NUM	10

struct f_uac2_opts {
	struct usb_function_instance	func_inst;
@@ -34,6 +42,19 @@ struct f_uac2_opts {
	int				c_srate;
	int				c_ssize;
	int				c_sync;

	bool			p_mute_present;
	bool			p_volume_present;
	s16				p_volume_min;
	s16				p_volume_max;
	s16				p_volume_res;

	bool			c_mute_present;
	bool			c_volume_present;
	s16				c_volume_min;
	s16				c_volume_max;
	s16				c_volume_res;

	int				req_number;
	int				fb_max;
	bool			bound;