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
qcom_snd_usb_offload_jack_setup(struct snd_soc_pcm_runtime * rtd,struct snd_soc_jack * jack,bool * jack_setup)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
qcom_snd_usb_offload_jack_remove(struct snd_soc_pcm_runtime * rtd,bool * jack_setup)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