Some platforms may want to register its USB port to be handled by the ASoC framework. Audio playback/capture support is also handled entirely by the vendor ASoC drivers. Signed-off-by: Wesley Cheng <quic_wcheng@xxxxxxxxxxx> --- include/sound/soc-usb.h | 31 +++++++++++++++++++ sound/soc/Makefile | 2 +- sound/soc/soc-usb.c | 66 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 include/sound/soc-usb.h create mode 100644 sound/soc/soc-usb.c diff --git a/include/sound/soc-usb.h b/include/sound/soc-usb.h new file mode 100644 index 000000000000..7d52e5d2371c --- /dev/null +++ b/include/sound/soc-usb.h @@ -0,0 +1,31 @@ +/* SPDX-License-Identifier: GPL-2.0 + * + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. + */ + +#ifndef __LINUX_SND_SOC_USB_H +#define __LINUX_SND_SOC_USB_H + +/** + * struct snd_soc_usb + * @component - Reference to DAPM component + * @connection_status_cb - callback to notify connection events + * @priv_data - vendor data + **/ +struct snd_soc_usb { + struct snd_soc_component *component; + int (*connection_status_cb)(struct snd_soc_usb *usb, int card_idx, + int connected); + void *priv_data; +}; + +int snd_soc_usb_connect(int card_idx); +int snd_soc_usb_disconnect(void); +void snd_soc_usb_set_priv_data(void *priv); +void *snd_soc_usb_get_priv_data(void); + +struct snd_soc_usb *snd_soc_usb_add_port(struct device *dev, + int (*connection_cb)(struct snd_soc_usb *usb, int card_idx, + int connected)); +int snd_soc_usb_remove_port(void); +#endif diff --git a/sound/soc/Makefile b/sound/soc/Makefile index 507eaed1d6a1..3305ceb59d84 100644 --- a/sound/soc/Makefile +++ b/sound/soc/Makefile @@ -1,5 +1,5 @@ # SPDX-License-Identifier: GPL-2.0 -snd-soc-core-objs := soc-core.o soc-dapm.o soc-jack.o soc-utils.o soc-dai.o soc-component.o +snd-soc-core-objs := soc-core.o soc-dapm.o soc-jack.o soc-usb.o soc-utils.o soc-dai.o soc-component.o snd-soc-core-objs += soc-pcm.o soc-devres.o soc-ops.o soc-link.o soc-card.o snd-soc-core-$(CONFIG_SND_SOC_COMPRESS) += soc-compress.o diff --git a/sound/soc/soc-usb.c b/sound/soc/soc-usb.c new file mode 100644 index 000000000000..c6c376960e4d --- /dev/null +++ b/sound/soc/soc-usb.c @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. + */ +#include <linux/usb.h> +#include <sound/soc.h> +#include <sound/soc-usb.h> +#include "../usb/card.h" + +struct snd_soc_usb *ctx; + +void *snd_soc_usb_get_priv_data(void) +{ + if (ctx) + return ctx->priv_data; + + return 0; +} +EXPORT_SYMBOL_GPL(snd_soc_usb_get_priv_data); + +void snd_soc_usb_set_priv_data(void *priv) +{ + if (ctx) + ctx->priv_data = priv; +} +EXPORT_SYMBOL_GPL(snd_soc_usb_set_priv_data); + +struct snd_soc_usb *snd_soc_usb_add_port(struct device *dev, + int (*connection_cb)(struct snd_soc_usb *usb, int card_idx, + int connected)) +{ + struct snd_soc_usb *usb; + + usb = devm_kzalloc(dev, sizeof(*usb), GFP_KERNEL); + if (!usb) + return ERR_PTR(-ENOMEM); + + usb->connection_status_cb = connection_cb; + ctx = usb; + + return usb; +} +EXPORT_SYMBOL_GPL(snd_soc_usb_add_port); + +int snd_soc_usb_remove_port(void) +{ + ctx = NULL; + return 0; +} +EXPORT_SYMBOL_GPL(snd_soc_usb_remove_port); + +int snd_soc_usb_connect(int card_idx) +{ + if (ctx && ctx->connection_status_cb) + ctx->connection_status_cb(ctx, card_idx, 1); + return 0; +} +EXPORT_SYMBOL_GPL(snd_soc_usb_connect); + +int snd_soc_usb_disconnect(void) +{ + if (ctx && ctx->connection_status_cb) + ctx->connection_status_cb(ctx, -1, 0); + return 0; +} +EXPORT_SYMBOL_GPL(snd_soc_usb_disconnect);