1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0+ */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * u_uac1.h -- interface to USB gadget "ALSA AUDIO" utilities 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2008 Bryan Wu <cooloney@kernel.org> 6*4882a593Smuzhiyun * Copyright (C) 2008 Analog Devices, Inc 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #ifndef __U_UAC1_LEGACY_H 10*4882a593Smuzhiyun #define __U_UAC1_LEGACY_H 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #include <linux/device.h> 13*4882a593Smuzhiyun #include <linux/err.h> 14*4882a593Smuzhiyun #include <linux/usb/audio.h> 15*4882a593Smuzhiyun #include <linux/usb/composite.h> 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun #include <sound/core.h> 18*4882a593Smuzhiyun #include <sound/pcm.h> 19*4882a593Smuzhiyun #include <sound/pcm_params.h> 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun #define FILE_PCM_PLAYBACK "/dev/snd/pcmC0D0p" 22*4882a593Smuzhiyun #define FILE_PCM_CAPTURE "/dev/snd/pcmC0D0c" 23*4882a593Smuzhiyun #define FILE_CONTROL "/dev/snd/controlC0" 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun #define UAC1_OUT_EP_MAX_PACKET_SIZE 200 26*4882a593Smuzhiyun #define UAC1_REQ_COUNT 256 27*4882a593Smuzhiyun #define UAC1_AUDIO_BUF_SIZE 48000 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun /* 30*4882a593Smuzhiyun * This represents the USB side of an audio card device, managed by a USB 31*4882a593Smuzhiyun * function which provides control and stream interfaces. 32*4882a593Smuzhiyun */ 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun struct gaudio_snd_dev { 35*4882a593Smuzhiyun struct gaudio *card; 36*4882a593Smuzhiyun struct file *filp; 37*4882a593Smuzhiyun struct snd_pcm_substream *substream; 38*4882a593Smuzhiyun int access; 39*4882a593Smuzhiyun int format; 40*4882a593Smuzhiyun int channels; 41*4882a593Smuzhiyun int rate; 42*4882a593Smuzhiyun }; 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun struct gaudio { 45*4882a593Smuzhiyun struct usb_function func; 46*4882a593Smuzhiyun struct usb_gadget *gadget; 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun /* ALSA sound device interfaces */ 49*4882a593Smuzhiyun struct gaudio_snd_dev control; 50*4882a593Smuzhiyun struct gaudio_snd_dev playback; 51*4882a593Smuzhiyun struct gaudio_snd_dev capture; 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun /* TODO */ 54*4882a593Smuzhiyun }; 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun struct f_uac1_legacy_opts { 57*4882a593Smuzhiyun struct usb_function_instance func_inst; 58*4882a593Smuzhiyun int req_buf_size; 59*4882a593Smuzhiyun int req_count; 60*4882a593Smuzhiyun int audio_buf_size; 61*4882a593Smuzhiyun char *fn_play; 62*4882a593Smuzhiyun char *fn_cap; 63*4882a593Smuzhiyun char *fn_cntl; 64*4882a593Smuzhiyun unsigned bound:1; 65*4882a593Smuzhiyun unsigned fn_play_alloc:1; 66*4882a593Smuzhiyun unsigned fn_cap_alloc:1; 67*4882a593Smuzhiyun unsigned fn_cntl_alloc:1; 68*4882a593Smuzhiyun struct mutex lock; 69*4882a593Smuzhiyun int refcnt; 70*4882a593Smuzhiyun }; 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun int gaudio_setup(struct gaudio *card); 73*4882a593Smuzhiyun void gaudio_cleanup(struct gaudio *the_card); 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun size_t u_audio_playback(struct gaudio *card, void *buf, size_t count); 76*4882a593Smuzhiyun int u_audio_get_playback_channels(struct gaudio *card); 77*4882a593Smuzhiyun int u_audio_get_playback_rate(struct gaudio *card); 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun #endif /* __U_UAC1_LEGACY_H */ 80