| /* SPDX-License-Identifier: GPL-2.0 |
| * |
| * Copyright (c) 2022-2025 Qualcomm Innovation Center, Inc. All rights reserved. |
| */ |
| |
| #ifndef __LINUX_SND_SOC_USB_H |
| #define __LINUX_SND_SOC_USB_H |
| |
| #include <sound/soc.h> |
| |
| enum snd_soc_usb_kctl { |
| SND_SOC_USB_KCTL_CARD_ROUTE, |
| SND_SOC_USB_KCTL_PCM_ROUTE, |
| }; |
| |
| /** |
| * struct snd_soc_usb_device - SoC USB representation of a USB sound device |
| * @card_idx: sound card index associated with USB device |
| * @chip_idx: USB sound chip array index |
| * @cpcm_idx: capture PCM index array associated with USB device |
| * @ppcm_idx: playback PCM index array associated with USB device |
| * @num_capture: number of capture streams |
| * @num_playback: number of playback streams |
| * @list: list head for SoC USB devices |
| **/ |
| struct snd_soc_usb_device { |
| int card_idx; |
| int chip_idx; |
| |
| /* PCM index arrays */ |
| unsigned int *cpcm_idx; /* TODO: capture path is not tested yet */ |
| unsigned int *ppcm_idx; |
| int num_capture; /* TODO: capture path is not tested yet */ |
| int num_playback; |
| |
| struct list_head list; |
| }; |
| |
| /** |
| * struct snd_soc_usb - representation of a SoC USB backend entity |
| * @list: list head for SND SOC struct list |
| * @component: reference to ASoC component |
| * @connection_status_cb: callback to notify connection events |
| * @update_offload_route_info: callback to fetch mapped ASoC card and pcm |
| * device pair. This is unrelated to the concept |
| * of DAPM route. The "route" argument carries |
| * an array used for a kcontrol output for either |
| * the card or pcm index. "path" determines the |
| * which entry to look for. (ie mapped card or pcm) |
| * @priv_data: driver data |
| **/ |
| struct snd_soc_usb { |
| struct list_head list; |
| struct snd_soc_component *component; |
| int (*connection_status_cb)(struct snd_soc_usb *usb, |
| struct snd_soc_usb_device *sdev, |
| bool connected); |
| int (*update_offload_route_info)(struct snd_soc_component *component, |
| int card, int pcm, int direction, |
| enum snd_soc_usb_kctl path, |
| long *route); |
| void *priv_data; |
| }; |
| |
| #if IS_ENABLED(CONFIG_SND_SOC_USB) |
| int snd_soc_usb_find_supported_format(int card_idx, |
| struct snd_pcm_hw_params *params, |
| int direction); |
| |
| int snd_soc_usb_connect(struct device *usbdev, struct snd_soc_usb_device *sdev); |
| int snd_soc_usb_disconnect(struct device *usbdev, struct snd_soc_usb_device *sdev); |
| void *snd_soc_usb_find_priv_data(struct device *usbdev); |
| |
| int snd_soc_usb_setup_offload_jack(struct snd_soc_component *component, |
| struct snd_soc_jack *jack); |
| int snd_soc_usb_update_offload_route(struct device *dev, int card, int pcm, |
| int direction, enum snd_soc_usb_kctl path, |
| long *route); |
| |
| struct snd_soc_usb *snd_soc_usb_allocate_port(struct snd_soc_component *component, |
| void *data); |
| void snd_soc_usb_free_port(struct snd_soc_usb *usb); |
| void snd_soc_usb_add_port(struct snd_soc_usb *usb); |
| void snd_soc_usb_remove_port(struct snd_soc_usb *usb); |
| #else |
| static inline int |
| snd_soc_usb_find_supported_format(int card_idx, struct snd_pcm_hw_params *params, |
| int direction) |
| { |
| return -EINVAL; |
| } |
| |
| static inline int snd_soc_usb_connect(struct device *usbdev, |
| struct snd_soc_usb_device *sdev) |
| { |
| return -ENODEV; |
| } |
| |
| static inline int snd_soc_usb_disconnect(struct device *usbdev, |
| struct snd_soc_usb_device *sdev) |
| { |
| return -EINVAL; |
| } |
| |
| static inline void *snd_soc_usb_find_priv_data(struct device *usbdev) |
| { |
| return NULL; |
| } |
| |
| static inline int snd_soc_usb_setup_offload_jack(struct snd_soc_component *component, |
| struct snd_soc_jack *jack) |
| { |
| return 0; |
| } |
| |
| static int snd_soc_usb_update_offload_route(struct device *dev, int card, int pcm, |
| int direction, enum snd_soc_usb_kctl path, |
| long *route) |
| { |
| return -ENODEV; |
| } |
| |
| static inline struct snd_soc_usb * |
| snd_soc_usb_allocate_port(struct snd_soc_component *component, void *data) |
| { |
| return ERR_PTR(-ENOMEM); |
| } |
| |
| static inline void snd_soc_usb_free_port(struct snd_soc_usb *usb) |
| { } |
| |
| static inline void snd_soc_usb_add_port(struct snd_soc_usb *usb) |
| { } |
| |
| static inline void snd_soc_usb_remove_port(struct snd_soc_usb *usb) |
| { } |
| #endif /* IS_ENABLED(CONFIG_SND_SOC_USB) */ |
| #endif /*__LINUX_SND_SOC_USB_H */ |