1717#include <sound/core.h>
1818#include <sound/pcm.h>
1919#include <sound/pcm_params.h>
20+ #ifdef CONFIG_AMLOGIC_BRIDGE_UAC
21+ #include <linux/amlogic/bridge_uac_ext.h>
22+ #endif
2023#include <sound/control.h>
2124#include <sound/tlv.h>
2225#include <linux/usb/audio.h>
2730#define PRD_SIZE_MAX PAGE_SIZE
2831#define MIN_PERIODS 4
2932
33+ #ifdef CONFIG_AMLOGIC_BRIDGE_UAC
34+ struct bridge_uac_function bridge_uac_f = {0 };
35+
36+ void * get_uac_function_p (void )
37+ {
38+ return & bridge_uac_f ;
39+ }
40+ EXPORT_SYMBOL (get_uac_function_p );
41+ #endif
42+
3043enum {
3144 UAC_FBACK_CTRL ,
3245 UAC_MUTE_CTRL ,
@@ -171,6 +184,41 @@ static void u_audio_iso_complete(struct usb_ep *ep, struct usb_request *req)
171184 pr_debug ("%s: iso_complete status(%d) %d/%d\n" ,
172185 __func__ , status , req -> actual , req -> length );
173186
187+ #ifdef CONFIG_AMLOGIC_BRIDGE_UAC
188+ if (prm == & uac -> p_prm ) {
189+ if (bridge_uac_f .setup_playback && bridge_uac_f .get_playback_status ()) {
190+ /*
191+ * For each IN packet, take the quotient of the current data
192+ * rate and the endpoint's interval as the base packet size.
193+ * If there is a residue from this division, add it to the
194+ * residue accumulator.
195+ */
196+ req -> length = uac -> p_pktsize ;
197+ uac -> p_residue += uac -> p_pktsize_residue ;
198+
199+ /*
200+ * Whenever there are more bytes in the accumulator than we
201+ * need to add one more sample frame, increase this packet's
202+ * size and decrease the accumulator.
203+ */
204+ if (uac -> p_residue / uac -> p_interval >= uac -> p_framesize ) {
205+ req -> length += uac -> p_framesize ;
206+ uac -> p_residue -= uac -> p_framesize *
207+ uac -> p_interval ;
208+ }
209+
210+ req -> actual = req -> length ;
211+ if (req -> actual )
212+ bridge_uac_f .read_data (req -> buf , req -> actual );
213+ }
214+ } else {
215+ if (bridge_uac_f .setup_capture && bridge_uac_f .get_capture_status ()) {
216+ if (req -> actual )
217+ bridge_uac_f .write_data (req -> buf , req -> actual );
218+ }
219+ }
220+ #endif
221+
174222 substream = prm -> ss ;
175223
176224 /* Do nothing if ALSA isn't active */
@@ -540,6 +588,10 @@ int u_audio_start_capture(struct g_audio *audio_dev)
540588 if (usb_ep_queue (ep_fback , req_fback , GFP_ATOMIC ))
541589 dev_err (dev , "%s:%d Error!\n" , __func__ , __LINE__ );
542590
591+ #ifdef CONFIG_AMLOGIC_BRIDGE_UAC
592+ if (bridge_uac_f .setup_capture && bridge_uac_f .get_capture_status ())
593+ bridge_uac_f .start_capture ();
594+ #endif
543595 return 0 ;
544596}
545597EXPORT_SYMBOL_GPL (u_audio_start_capture );
@@ -550,6 +602,10 @@ void u_audio_stop_capture(struct g_audio *audio_dev)
550602
551603 if (audio_dev -> in_ep_fback )
552604 free_ep_fback (& uac -> c_prm , audio_dev -> in_ep_fback );
605+ #ifdef CONFIG_AMLOGIC_BRIDGE_UAC
606+ if (bridge_uac_f .setup_capture && bridge_uac_f .get_capture_status ())
607+ bridge_uac_f .stop_capture ();
608+ #endif
553609 free_ep (& uac -> c_prm , audio_dev -> out_ep );
554610}
555611EXPORT_SYMBOL_GPL (u_audio_stop_capture );
@@ -619,6 +675,11 @@ int u_audio_start_playback(struct g_audio *audio_dev)
619675 dev_err (dev , "%s:%d Error!\n" , __func__ , __LINE__ );
620676 }
621677
678+ #ifdef CONFIG_AMLOGIC_BRIDGE_UAC
679+ if (bridge_uac_f .setup_playback && bridge_uac_f .get_playback_status ())
680+ bridge_uac_f .start_playback ();
681+ #endif
682+
622683 return 0 ;
623684}
624685EXPORT_SYMBOL_GPL (u_audio_start_playback );
@@ -627,6 +688,11 @@ void u_audio_stop_playback(struct g_audio *audio_dev)
627688{
628689 struct snd_uac_chip * uac = audio_dev -> uac ;
629690
691+ #ifdef CONFIG_AMLOGIC_BRIDGE_UAC
692+ if (bridge_uac_f .setup_playback && bridge_uac_f .get_playback_status ())
693+ bridge_uac_f .stop_playback ();
694+ #endif
695+
630696 free_ep (& uac -> p_prm , audio_dev -> in_ep );
631697}
632698EXPORT_SYMBOL_GPL (u_audio_stop_playback );
@@ -666,6 +732,12 @@ int u_audio_set_volume(struct g_audio *audio_dev, int playback, s16 val)
666732 val = clamp (val , prm -> volume_min , prm -> volume_max );
667733 if (prm -> volume != val ) {
668734 prm -> volume = val ;
735+ #ifdef CONFIG_AMLOGIC_BRIDGE_UAC
736+ if (bridge_uac_f .setup_playback && playback )
737+ bridge_uac_f .ctl_playback (0 , prm -> volume );
738+ else if (bridge_uac_f .setup_capture && !playback )
739+ bridge_uac_f .ctl_capture (0 , prm -> volume );
740+ #endif
669741 change = 1 ;
670742 }
671743 spin_unlock_irqrestore (& prm -> lock , flags );
@@ -716,6 +788,12 @@ int u_audio_set_mute(struct g_audio *audio_dev, int playback, int val)
716788 if (prm -> mute != mute ) {
717789 prm -> mute = mute ;
718790 change = 1 ;
791+ #ifdef CONFIG_AMLOGIC_BRIDGE_UAC
792+ if (bridge_uac_f .setup_playback && playback )
793+ bridge_uac_f .ctl_playback (0 , prm -> mute );
794+ else if (bridge_uac_f .setup_capture && !playback )
795+ bridge_uac_f .ctl_capture (0 , prm -> mute );
796+ #endif
719797 }
720798 spin_unlock_irqrestore (& prm -> lock , flags );
721799
@@ -1135,6 +1213,16 @@ int g_audio_setup(struct g_audio *g_audio, const char *pcm_name,
11351213 prm -> volume_max = fu -> volume_max ;
11361214 prm -> volume_min = fu -> volume_min ;
11371215 prm -> volume_res = fu -> volume_res ;
1216+
1217+ #ifdef CONFIG_AMLOGIC_BRIDGE_UAC
1218+ if (i == SNDRV_PCM_STREAM_CAPTURE && bridge_uac_f .setup_capture ) {
1219+ prm -> volume = bridge_uac_f .get_default_volume_capture ();
1220+ bridge_uac_f .ctl_capture (0 , prm -> volume );
1221+ } else if (i == SNDRV_PCM_STREAM_PLAYBACK && bridge_uac_f .setup_playback ) {
1222+ prm -> volume = bridge_uac_f .get_default_volume_playback ();
1223+ bridge_uac_f .ctl_playback (0 , prm -> volume );
1224+ }
1225+ #endif
11381226 }
11391227 }
11401228
0 commit comments