Merge "sound: usb: Map audio format received from QMI client"
This commit is contained in:
commit
39a4ec35cc
1 changed files with 76 additions and 1 deletions
|
@ -147,6 +147,27 @@ enum mem_type {
|
||||||
MEM_XFER_BUF,
|
MEM_XFER_BUF,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum usb_qmi_audio_format {
|
||||||
|
USB_QMI_PCM_FORMAT_S8 = 0,
|
||||||
|
USB_QMI_PCM_FORMAT_U8,
|
||||||
|
USB_QMI_PCM_FORMAT_S16_LE,
|
||||||
|
USB_QMI_PCM_FORMAT_S16_BE,
|
||||||
|
USB_QMI_PCM_FORMAT_U16_LE,
|
||||||
|
USB_QMI_PCM_FORMAT_U16_BE,
|
||||||
|
USB_QMI_PCM_FORMAT_S24_LE,
|
||||||
|
USB_QMI_PCM_FORMAT_S24_BE,
|
||||||
|
USB_QMI_PCM_FORMAT_U24_LE,
|
||||||
|
USB_QMI_PCM_FORMAT_U24_BE,
|
||||||
|
USB_QMI_PCM_FORMAT_S24_3LE,
|
||||||
|
USB_QMI_PCM_FORMAT_S24_3BE,
|
||||||
|
USB_QMI_PCM_FORMAT_U24_3LE,
|
||||||
|
USB_QMI_PCM_FORMAT_U24_3BE,
|
||||||
|
USB_QMI_PCM_FORMAT_S32_LE,
|
||||||
|
USB_QMI_PCM_FORMAT_S32_BE,
|
||||||
|
USB_QMI_PCM_FORMAT_U32_LE,
|
||||||
|
USB_QMI_PCM_FORMAT_U32_BE,
|
||||||
|
};
|
||||||
|
|
||||||
static unsigned long uaudio_get_iova(unsigned long *curr_iova,
|
static unsigned long uaudio_get_iova(unsigned long *curr_iova,
|
||||||
size_t *curr_iova_size, struct list_head *head, size_t size)
|
size_t *curr_iova_size, struct list_head *head, size_t size)
|
||||||
{
|
{
|
||||||
|
@ -767,6 +788,51 @@ static void uaudio_dev_release(struct kref *kref)
|
||||||
wake_up(&dev->disconnect_wq);
|
wake_up(&dev->disconnect_wq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* maps audio format received over QMI to asound.h based pcm format */
|
||||||
|
int map_pcm_format(unsigned int fmt_received)
|
||||||
|
{
|
||||||
|
switch (fmt_received) {
|
||||||
|
case USB_QMI_PCM_FORMAT_S8:
|
||||||
|
return SNDRV_PCM_FORMAT_S8;
|
||||||
|
case USB_QMI_PCM_FORMAT_U8:
|
||||||
|
return SNDRV_PCM_FORMAT_U8;
|
||||||
|
case USB_QMI_PCM_FORMAT_S16_LE:
|
||||||
|
return SNDRV_PCM_FORMAT_S16_LE;
|
||||||
|
case USB_QMI_PCM_FORMAT_S16_BE:
|
||||||
|
return SNDRV_PCM_FORMAT_S16_BE;
|
||||||
|
case USB_QMI_PCM_FORMAT_U16_LE:
|
||||||
|
return SNDRV_PCM_FORMAT_U16_LE;
|
||||||
|
case USB_QMI_PCM_FORMAT_U16_BE:
|
||||||
|
return SNDRV_PCM_FORMAT_U16_BE;
|
||||||
|
case USB_QMI_PCM_FORMAT_S24_LE:
|
||||||
|
return SNDRV_PCM_FORMAT_S24_LE;
|
||||||
|
case USB_QMI_PCM_FORMAT_S24_BE:
|
||||||
|
return SNDRV_PCM_FORMAT_S24_BE;
|
||||||
|
case USB_QMI_PCM_FORMAT_U24_LE:
|
||||||
|
return SNDRV_PCM_FORMAT_U24_LE;
|
||||||
|
case USB_QMI_PCM_FORMAT_U24_BE:
|
||||||
|
return SNDRV_PCM_FORMAT_U24_BE;
|
||||||
|
case USB_QMI_PCM_FORMAT_S24_3LE:
|
||||||
|
return SNDRV_PCM_FORMAT_S24_3LE;
|
||||||
|
case USB_QMI_PCM_FORMAT_S24_3BE:
|
||||||
|
return SNDRV_PCM_FORMAT_S24_3BE;
|
||||||
|
case USB_QMI_PCM_FORMAT_U24_3LE:
|
||||||
|
return SNDRV_PCM_FORMAT_U24_3LE;
|
||||||
|
case USB_QMI_PCM_FORMAT_U24_3BE:
|
||||||
|
return SNDRV_PCM_FORMAT_U24_3BE;
|
||||||
|
case USB_QMI_PCM_FORMAT_S32_LE:
|
||||||
|
return SNDRV_PCM_FORMAT_S32_LE;
|
||||||
|
case USB_QMI_PCM_FORMAT_S32_BE:
|
||||||
|
return SNDRV_PCM_FORMAT_S32_BE;
|
||||||
|
case USB_QMI_PCM_FORMAT_U32_LE:
|
||||||
|
return SNDRV_PCM_FORMAT_U32_LE;
|
||||||
|
case USB_QMI_PCM_FORMAT_U32_BE:
|
||||||
|
return SNDRV_PCM_FORMAT_U32_BE;
|
||||||
|
default:
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int handle_uaudio_stream_req(void *req_h, void *req)
|
static int handle_uaudio_stream_req(void *req_h, void *req)
|
||||||
{
|
{
|
||||||
struct qmi_uaudio_stream_req_msg_v01 *req_msg;
|
struct qmi_uaudio_stream_req_msg_v01 *req_msg;
|
||||||
|
@ -775,6 +841,7 @@ static int handle_uaudio_stream_req(void *req_h, void *req)
|
||||||
struct snd_usb_audio *chip = NULL;
|
struct snd_usb_audio *chip = NULL;
|
||||||
struct uaudio_qmi_svc *svc = uaudio_svc;
|
struct uaudio_qmi_svc *svc = uaudio_svc;
|
||||||
struct intf_info *info;
|
struct intf_info *info;
|
||||||
|
int pcm_format;
|
||||||
u8 pcm_card_num, pcm_dev_num, direction;
|
u8 pcm_card_num, pcm_dev_num, direction;
|
||||||
int intf_num = -1, ret = 0;
|
int intf_num = -1, ret = 0;
|
||||||
|
|
||||||
|
@ -802,6 +869,14 @@ static int handle_uaudio_stream_req(void *req_h, void *req)
|
||||||
goto response;
|
goto response;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pcm_format = map_pcm_format(req_msg->audio_format);
|
||||||
|
if (pcm_format == -EINVAL) {
|
||||||
|
pr_err("%s: unsupported pcm format received %d\n",
|
||||||
|
__func__, req_msg->audio_format);
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto response;
|
||||||
|
}
|
||||||
|
|
||||||
subs = find_snd_usb_substream(pcm_card_num, pcm_dev_num, direction,
|
subs = find_snd_usb_substream(pcm_card_num, pcm_dev_num, direction,
|
||||||
&chip, uaudio_disconnect_cb);
|
&chip, uaudio_disconnect_cb);
|
||||||
if (!subs || !chip || atomic_read(&chip->shutdown)) {
|
if (!subs || !chip || atomic_read(&chip->shutdown)) {
|
||||||
|
@ -820,7 +895,7 @@ static int handle_uaudio_stream_req(void *req_h, void *req)
|
||||||
goto response;
|
goto response;
|
||||||
}
|
}
|
||||||
|
|
||||||
subs->pcm_format = req_msg->audio_format;
|
subs->pcm_format = pcm_format;
|
||||||
subs->channels = req_msg->number_of_ch;
|
subs->channels = req_msg->number_of_ch;
|
||||||
subs->cur_rate = req_msg->bit_rate;
|
subs->cur_rate = req_msg->bit_rate;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue