From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: Akash Kumar <quic_akakum@quicinc.com>
Cc: "Thinh Nguyen" <Thinh.Nguyen@synopsys.com>,
"Jing Leng" <jleng@ambarella.com>,
"Felipe Balbi" <balbi@kernel.org>,
"Pratham Pratap " <quic_ppratap@quicinc.com>,
"Jack Pham" <quic_jackp@quicinc.com>,
linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2] usb: gadget: f_uac2: uevent changes for uac2
Date: Tue, 8 Aug 2023 10:29:47 +0200 [thread overview]
Message-ID: <2023080837-droplet-mace-dfbb@gregkh> (raw)
In-Reply-To: <20230723190538.27750-1-quic_akakum@quicinc.com>
On Mon, Jul 24, 2023 at 12:35:38AM +0530, Akash Kumar wrote:
> Adding uevent from usb audio gadget driver for uac2 playback/capture
> events, which userspace reads and later reads sysfs entry to know if
> playback or capture has stopped or started by host application.
How do you keep the events in sync then? If you get a uevent, and then
wait a while before reading sysfs, how do you know that a different
uevent didn't happen inbetween?
> /config/usb_gadget/g1/functions/uac2.0 # cat c_status
> 1 --> capture started
> 0 --> capture stopped
> /config/usb_gadget/g1/functions/uac2.0 # cat p_status
> 1 --> playback started
> 0 --> playback stopped
>
> Signed-off-by: Akash Kumar <quic_akakum@quicinc.com>
> ---
> .../ABI/testing/configfs-usb-gadget-uac2 | 4 ++
> drivers/usb/gadget/function/f_uac2.c | 47 +++++++++++++++++++
> drivers/usb/gadget/function/u_uac2.h | 5 ++
> 3 files changed, 56 insertions(+)
>
> diff --git a/Documentation/ABI/testing/configfs-usb-gadget-uac2 b/Documentation/ABI/testing/configfs-usb-gadget-uac2
> index 2bfdd4efa9bd..196c6921a163 100644
> --- a/Documentation/ABI/testing/configfs-usb-gadget-uac2
> +++ b/Documentation/ABI/testing/configfs-usb-gadget-uac2
> @@ -10,3 +10,7 @@ Description:
> p_chmask - playback channel mask
> p_srate - playback sampling rate
> p_ssize - playback sample size (bytes)
> + c_status - usb uac2 audio capture state
> + (0: capture stopped, 1: capture started)
> + p_status - usb uac2 audio playback state
> + (0: playback stopped, 1: playback started)
> diff --git a/drivers/usb/gadget/function/f_uac2.c b/drivers/usb/gadget/function/f_uac2.c
> index db2d4980cb35..f1f7631e9380 100644
> --- a/drivers/usb/gadget/function/f_uac2.c
> +++ b/drivers/usb/gadget/function/f_uac2.c
> @@ -739,6 +739,8 @@ afunc_set_alt(struct usb_function *fn, unsigned intf, unsigned alt)
> struct usb_gadget *gadget = cdev->gadget;
> struct device *dev = &gadget->dev;
> int ret = 0;
> + struct f_uac2_opts *audio_opts =
> + container_of(fn->fi, struct f_uac2_opts, func_inst);
>
> /* No i/f has more than 2 alt settings */
> if (alt > 1) {
> @@ -762,6 +764,8 @@ afunc_set_alt(struct usb_function *fn, unsigned intf, unsigned alt)
> ret = u_audio_start_capture(&uac2->g_audio);
> else
> u_audio_stop_capture(&uac2->g_audio);
> + audio_opts->c_status = alt;
> + schedule_work(&audio_opts->work);
> } else if (intf == uac2->as_in_intf) {
> uac2->as_in_alt = alt;
>
> @@ -769,6 +773,8 @@ afunc_set_alt(struct usb_function *fn, unsigned intf, unsigned alt)
> ret = u_audio_start_playback(&uac2->g_audio);
> else
> u_audio_stop_playback(&uac2->g_audio);
> + audio_opts->p_status = alt;
> + schedule_work(&audio_opts->work);
> } else {
> dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
> return -EINVAL;
> @@ -801,11 +807,16 @@ static void
> afunc_disable(struct usb_function *fn)
> {
> struct f_uac2 *uac2 = func_to_uac2(fn);
> + struct f_uac2_opts *audio_opts =
> + container_of(fn->fi, struct f_uac2_opts, func_inst);
>
> uac2->as_in_alt = 0;
> uac2->as_out_alt = 0;
> + audio_opts->p_status = 0;//alt;
> + audio_opts->c_status = 0; //alt;
> u_audio_stop_capture(&uac2->g_audio);
> u_audio_stop_playback(&uac2->g_audio);
> + schedule_work(&audio_opts->work);
> }
>
> static int
> @@ -1036,6 +1047,25 @@ UAC2_ATTRIBUTE(c_srate);
> UAC2_ATTRIBUTE(c_ssize);
> UAC2_ATTRIBUTE(req_number);
>
> +#define UAC2_ATTRIBUTE_RO(name) \
> + static ssize_t f_uac2_opts_##name##_show( \
> + struct config_item *item, \
> + char *page) \
> +{ \
> + struct f_uac2_opts *opts = to_f_uac2_opts(item); \
> + int result; \
> + \
> + mutex_lock(&opts->lock); \
> + result = scnprintf(page, PAGE_SIZE, "%u\n", opts->name); \
> + mutex_unlock(&opts->lock); \
> + \
> + return result; \
> +} \
> +CONFIGFS_ATTR_RO(f_uac2_opts_, name)
> +
> +UAC2_ATTRIBUTE_RO(c_status);
> +UAC2_ATTRIBUTE_RO(p_status);
> +
> static struct configfs_attribute *f_uac2_attrs[] = {
> &f_uac2_opts_attr_p_chmask,
> &f_uac2_opts_attr_p_srate,
> @@ -1044,6 +1074,8 @@ static struct configfs_attribute *f_uac2_attrs[] = {
> &f_uac2_opts_attr_c_srate,
> &f_uac2_opts_attr_c_ssize,
> &f_uac2_opts_attr_req_number,
> + &f_uac2_opts_attr_c_status,
> + &f_uac2_opts_attr_p_status,
You didn't document these new attributes either in Documentation/ABI/
Also, what userspace tool is going to use these?
thanks,
greg k-h
prev parent reply other threads:[~2023-08-08 20:51 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-07-23 19:05 [PATCH v2] usb: gadget: f_uac2: uevent changes for uac2 Akash Kumar
2023-08-08 8:29 ` Greg Kroah-Hartman [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=2023080837-droplet-mace-dfbb@gregkh \
--to=gregkh@linuxfoundation.org \
--cc=Thinh.Nguyen@synopsys.com \
--cc=balbi@kernel.org \
--cc=jleng@ambarella.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=quic_akakum@quicinc.com \
--cc=quic_jackp@quicinc.com \
--cc=quic_ppratap@quicinc.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox