xref: /linux/sound/soc/qcom/usb_offload_utils.c (revision fcab107abe1ab5be9dbe874baa722372da8f4f73)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (c) 2022-2025 Qualcomm Innovation Center, Inc. All rights reserved.
4  */
5 #include <dt-bindings/sound/qcom,q6afe.h>
6 #include <linux/module.h>
7 #include <sound/jack.h>
8 #include <sound/soc-usb.h>
9 
10 #include "usb_offload_utils.h"
11 
12 int qcom_snd_usb_offload_jack_setup(struct snd_soc_pcm_runtime *rtd,
13 				    struct snd_soc_jack *jack, bool *jack_setup)
14 {
15 	struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
16 	struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
17 	int ret = 0;
18 
19 	if (cpu_dai->id != USB_RX)
20 		return -EINVAL;
21 
22 	if (!*jack_setup) {
23 		ret = snd_soc_usb_setup_offload_jack(codec_dai->component, jack);
24 		if (ret)
25 			return ret;
26 	}
27 
28 	*jack_setup = true;
29 
30 	return 0;
31 }
32 EXPORT_SYMBOL_GPL(qcom_snd_usb_offload_jack_setup);
33 
34 int qcom_snd_usb_offload_jack_remove(struct snd_soc_pcm_runtime *rtd,
35 				     bool *jack_setup)
36 {
37 	struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
38 	struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
39 	int ret = 0;
40 
41 	if (cpu_dai->id != USB_RX)
42 		return -EINVAL;
43 
44 	if (*jack_setup) {
45 		ret = snd_soc_component_set_jack(codec_dai->component, NULL, NULL);
46 		if (ret)
47 			return ret;
48 	}
49 
50 	*jack_setup = false;
51 
52 	return 0;
53 }
54 EXPORT_SYMBOL_GPL(qcom_snd_usb_offload_jack_remove);
55 MODULE_DESCRIPTION("ASoC Q6 USB offload controls");
56 MODULE_LICENSE("GPL");
57