1dba7759aSWesley Cheng /* SPDX-License-Identifier: GPL-2.0
2dba7759aSWesley Cheng *
3dba7759aSWesley Cheng * Copyright (c) 2022-2025 Qualcomm Innovation Center, Inc. All rights reserved.
4dba7759aSWesley Cheng */
5dba7759aSWesley Cheng
6dba7759aSWesley Cheng #ifndef __LINUX_SND_SOC_USB_H
7dba7759aSWesley Cheng #define __LINUX_SND_SOC_USB_H
8dba7759aSWesley Cheng
9dba7759aSWesley Cheng #include <sound/soc.h>
10dba7759aSWesley Cheng
11*234ed325SWesley Cheng enum snd_soc_usb_kctl {
12*234ed325SWesley Cheng SND_SOC_USB_KCTL_CARD_ROUTE,
13*234ed325SWesley Cheng SND_SOC_USB_KCTL_PCM_ROUTE,
14*234ed325SWesley Cheng };
15*234ed325SWesley Cheng
16dba7759aSWesley Cheng /**
17dba7759aSWesley Cheng * struct snd_soc_usb_device - SoC USB representation of a USB sound device
18dba7759aSWesley Cheng * @card_idx: sound card index associated with USB device
19dba7759aSWesley Cheng * @chip_idx: USB sound chip array index
20dba7759aSWesley Cheng * @cpcm_idx: capture PCM index array associated with USB device
21dba7759aSWesley Cheng * @ppcm_idx: playback PCM index array associated with USB device
22dba7759aSWesley Cheng * @num_capture: number of capture streams
23dba7759aSWesley Cheng * @num_playback: number of playback streams
24dba7759aSWesley Cheng * @list: list head for SoC USB devices
25dba7759aSWesley Cheng **/
26dba7759aSWesley Cheng struct snd_soc_usb_device {
27dba7759aSWesley Cheng int card_idx;
28dba7759aSWesley Cheng int chip_idx;
29dba7759aSWesley Cheng
30dba7759aSWesley Cheng /* PCM index arrays */
31dba7759aSWesley Cheng unsigned int *cpcm_idx; /* TODO: capture path is not tested yet */
32dba7759aSWesley Cheng unsigned int *ppcm_idx;
33dba7759aSWesley Cheng int num_capture; /* TODO: capture path is not tested yet */
34dba7759aSWesley Cheng int num_playback;
35dba7759aSWesley Cheng
36dba7759aSWesley Cheng struct list_head list;
37dba7759aSWesley Cheng };
38dba7759aSWesley Cheng
39dba7759aSWesley Cheng /**
40dba7759aSWesley Cheng * struct snd_soc_usb - representation of a SoC USB backend entity
41dba7759aSWesley Cheng * @list: list head for SND SOC struct list
42dba7759aSWesley Cheng * @component: reference to ASoC component
43dba7759aSWesley Cheng * @connection_status_cb: callback to notify connection events
44*234ed325SWesley Cheng * @update_offload_route_info: callback to fetch mapped ASoC card and pcm
45*234ed325SWesley Cheng * device pair. This is unrelated to the concept
46*234ed325SWesley Cheng * of DAPM route. The "route" argument carries
47*234ed325SWesley Cheng * an array used for a kcontrol output for either
48*234ed325SWesley Cheng * the card or pcm index. "path" determines the
49*234ed325SWesley Cheng * which entry to look for. (ie mapped card or pcm)
50dba7759aSWesley Cheng * @priv_data: driver data
51dba7759aSWesley Cheng **/
52dba7759aSWesley Cheng struct snd_soc_usb {
53dba7759aSWesley Cheng struct list_head list;
54dba7759aSWesley Cheng struct snd_soc_component *component;
55dba7759aSWesley Cheng int (*connection_status_cb)(struct snd_soc_usb *usb,
56dba7759aSWesley Cheng struct snd_soc_usb_device *sdev,
57dba7759aSWesley Cheng bool connected);
58*234ed325SWesley Cheng int (*update_offload_route_info)(struct snd_soc_component *component,
59*234ed325SWesley Cheng int card, int pcm, int direction,
60*234ed325SWesley Cheng enum snd_soc_usb_kctl path,
61*234ed325SWesley Cheng long *route);
62dba7759aSWesley Cheng void *priv_data;
63dba7759aSWesley Cheng };
64dba7759aSWesley Cheng
65dba7759aSWesley Cheng #if IS_ENABLED(CONFIG_SND_SOC_USB)
6600f5d6bfSWesley Cheng int snd_soc_usb_find_supported_format(int card_idx,
6700f5d6bfSWesley Cheng struct snd_pcm_hw_params *params,
6800f5d6bfSWesley Cheng int direction);
6900f5d6bfSWesley Cheng
70dba7759aSWesley Cheng int snd_soc_usb_connect(struct device *usbdev, struct snd_soc_usb_device *sdev);
71dba7759aSWesley Cheng int snd_soc_usb_disconnect(struct device *usbdev, struct snd_soc_usb_device *sdev);
72dba7759aSWesley Cheng void *snd_soc_usb_find_priv_data(struct device *usbdev);
73dba7759aSWesley Cheng
740bb5f361SWesley Cheng int snd_soc_usb_setup_offload_jack(struct snd_soc_component *component,
750bb5f361SWesley Cheng struct snd_soc_jack *jack);
76*234ed325SWesley Cheng int snd_soc_usb_update_offload_route(struct device *dev, int card, int pcm,
77*234ed325SWesley Cheng int direction, enum snd_soc_usb_kctl path,
78*234ed325SWesley Cheng long *route);
790bb5f361SWesley Cheng
80dba7759aSWesley Cheng struct snd_soc_usb *snd_soc_usb_allocate_port(struct snd_soc_component *component,
81dba7759aSWesley Cheng void *data);
82dba7759aSWesley Cheng void snd_soc_usb_free_port(struct snd_soc_usb *usb);
83dba7759aSWesley Cheng void snd_soc_usb_add_port(struct snd_soc_usb *usb);
84dba7759aSWesley Cheng void snd_soc_usb_remove_port(struct snd_soc_usb *usb);
85dba7759aSWesley Cheng #else
8600f5d6bfSWesley Cheng static inline int
snd_soc_usb_find_supported_format(int card_idx,struct snd_pcm_hw_params * params,int direction)8700f5d6bfSWesley Cheng snd_soc_usb_find_supported_format(int card_idx, struct snd_pcm_hw_params *params,
8800f5d6bfSWesley Cheng int direction)
8900f5d6bfSWesley Cheng {
9000f5d6bfSWesley Cheng return -EINVAL;
9100f5d6bfSWesley Cheng }
9200f5d6bfSWesley Cheng
snd_soc_usb_connect(struct device * usbdev,struct snd_soc_usb_device * sdev)93dba7759aSWesley Cheng static inline int snd_soc_usb_connect(struct device *usbdev,
94dba7759aSWesley Cheng struct snd_soc_usb_device *sdev)
95dba7759aSWesley Cheng {
96dba7759aSWesley Cheng return -ENODEV;
97dba7759aSWesley Cheng }
98dba7759aSWesley Cheng
snd_soc_usb_disconnect(struct device * usbdev,struct snd_soc_usb_device * sdev)99dba7759aSWesley Cheng static inline int snd_soc_usb_disconnect(struct device *usbdev,
100dba7759aSWesley Cheng struct snd_soc_usb_device *sdev)
101dba7759aSWesley Cheng {
102dba7759aSWesley Cheng return -EINVAL;
103dba7759aSWesley Cheng }
104dba7759aSWesley Cheng
snd_soc_usb_find_priv_data(struct device * usbdev)105dba7759aSWesley Cheng static inline void *snd_soc_usb_find_priv_data(struct device *usbdev)
106dba7759aSWesley Cheng {
107dba7759aSWesley Cheng return NULL;
108dba7759aSWesley Cheng }
109dba7759aSWesley Cheng
snd_soc_usb_setup_offload_jack(struct snd_soc_component * component,struct snd_soc_jack * jack)1100bb5f361SWesley Cheng static inline int snd_soc_usb_setup_offload_jack(struct snd_soc_component *component,
1110bb5f361SWesley Cheng struct snd_soc_jack *jack)
1120bb5f361SWesley Cheng {
1130bb5f361SWesley Cheng return 0;
1140bb5f361SWesley Cheng }
1150bb5f361SWesley Cheng
snd_soc_usb_update_offload_route(struct device * dev,int card,int pcm,int direction,enum snd_soc_usb_kctl path,long * route)116*234ed325SWesley Cheng static int snd_soc_usb_update_offload_route(struct device *dev, int card, int pcm,
117*234ed325SWesley Cheng int direction, enum snd_soc_usb_kctl path,
118*234ed325SWesley Cheng long *route)
119*234ed325SWesley Cheng {
120*234ed325SWesley Cheng return -ENODEV;
121*234ed325SWesley Cheng }
122*234ed325SWesley Cheng
123dba7759aSWesley Cheng static inline struct snd_soc_usb *
snd_soc_usb_allocate_port(struct snd_soc_component * component,void * data)124dba7759aSWesley Cheng snd_soc_usb_allocate_port(struct snd_soc_component *component, void *data)
125dba7759aSWesley Cheng {
126dba7759aSWesley Cheng return ERR_PTR(-ENOMEM);
127dba7759aSWesley Cheng }
128dba7759aSWesley Cheng
snd_soc_usb_free_port(struct snd_soc_usb * usb)129dba7759aSWesley Cheng static inline void snd_soc_usb_free_port(struct snd_soc_usb *usb)
130dba7759aSWesley Cheng { }
131dba7759aSWesley Cheng
snd_soc_usb_add_port(struct snd_soc_usb * usb)132dba7759aSWesley Cheng static inline void snd_soc_usb_add_port(struct snd_soc_usb *usb)
133dba7759aSWesley Cheng { }
134dba7759aSWesley Cheng
snd_soc_usb_remove_port(struct snd_soc_usb * usb)135dba7759aSWesley Cheng static inline void snd_soc_usb_remove_port(struct snd_soc_usb *usb)
136dba7759aSWesley Cheng { }
137dba7759aSWesley Cheng #endif /* IS_ENABLED(CONFIG_SND_SOC_USB) */
138dba7759aSWesley Cheng #endif /*__LINUX_SND_SOC_USB_H */
139