Received: by 2002:a05:7412:a9a2:b0:e2:908c:2ebd with SMTP id o34csp222849rdh; Wed, 25 Oct 2023 23:34:30 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHQ2/aCV2UGGjyCGnv5UvENay35gie3U1J8fLwZBokLOUQQ/cvtNF5qbKEgIA0hhdrScZbG X-Received: by 2002:a67:e009:0:b0:457:cf6c:27c7 with SMTP id c9-20020a67e009000000b00457cf6c27c7mr11428141vsl.33.1698302049094; Wed, 25 Oct 2023 23:34:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1698302049; cv=none; d=google.com; s=arc-20160816; b=qjoM+FjroajGa4jj+hYzqswuuAfU1A7xjj/pthfR522st4W/43tV2DM6Y0Skg6iez1 s2WnSVAk9y1Xt7MeYnRVV6G9k2EcUT7C6wGds9JYheD6cjpcAH9y08q4oIEolWfJo+aW 1NUu3YEQc8/e74UG/V1XCPWT99itXLNESukrKWWQsBwhA0epS6Szp1oda/AbbSPAInci T0rRqv3FmVWHWafmsRb9j633aRe8zlceUWBLjBh4HwShI0L11EXYc5cA5U8RFqMLj5L0 EADAK/8Myh57sy3usnjucn0Zwki7old+8M2cngnNoTMLocfHcdsyXZmT7pRNe/A4ix8w AqnQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=tAnAkc6TwBJA7+4fp+4Np5WkOZfvzRbrX0uyOuK61KA=; fh=/ZmOaWgNiPqoTqNJU9EtTdPuHBEaqXhoWEDFzmEnHdk=; b=Rk7UnfmyeP9mwO4wLcx9jT/CANQuyLzV6Do9+dPhiZ629k1mLU1cosnK2SCGxTl+yK nTuaYJpWoejS85DX6RuqmM6k/L6E2kuxlIyIimm8HMdpcRBZbc0FowtyQwbwdT+sFyO+ MG2qvF2pcKNiorCV/2PGbrGtx+tOD6UhP6LB0cADefF7fM5/JdUvQcvqFiWRvryC9PtX /h8EH2nfwwBsiqMvypKpJiHQl28MvAem2PErjHLbS8jJITXkkyQEFKukqNioKfTXC3+V lzw2RG4DmS9nvqagNYvjRcqza+2rl7ix460Ef8ZeD+fVIvKrOpTUvWU7rWf1h1i1v7PM PAZg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@163.com header.s=s110527 header.b=ez+7t92v; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=163.com Return-Path: Received: from snail.vger.email (snail.vger.email. [23.128.96.37]) by mx.google.com with ESMTPS id f199-20020a25cfd0000000b00d9ad83f0b07si14088638ybg.658.2023.10.25.23.34.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 25 Oct 2023 23:34:09 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) client-ip=23.128.96.37; Authentication-Results: mx.google.com; dkim=pass header.i=@163.com header.s=s110527 header.b=ez+7t92v; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=163.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by snail.vger.email (Postfix) with ESMTP id 8613F81CC872; Wed, 25 Oct 2023 23:34:07 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at snail.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1343564AbjJZGeC (ORCPT + 99 others); Thu, 26 Oct 2023 02:34:02 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35854 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233221AbjJZGeB (ORCPT ); Thu, 26 Oct 2023 02:34:01 -0400 Received: from m15.mail.163.com (m15.mail.163.com [45.254.50.219]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id A9375C0; Wed, 25 Oct 2023 23:33:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=163.com; s=s110527; h=From:Subject:Date:Message-Id:MIME-Version; bh=tAnAk c6TwBJA7+4fp+4Np5WkOZfvzRbrX0uyOuK61KA=; b=ez+7t92vmB2fOPMCK+x4t DL2fhHnbL9/a3se/VzVcvNtU39vHFekOnd47GHfssoFR9prMU5cdaTWHbJPNQHCH wgDl1ID4Mv/w0nnE4Xc1d8CHVRuHTI139cbWLLaxv+eWe133vv2KB6E+MKwK11Xj A6xsH/b7FcQekz1Rt5vVkk= Received: from ubuntu.. (unknown [171.83.45.213]) by zwqz-smtp-mta-g2-2 (Coremail) with SMTP id _____wD3P0lFCDplUGTZAw--.45306S2; Thu, 26 Oct 2023 14:33:41 +0800 (CST) From: Charles Yi To: gregkh@linuxfoundation.org Cc: linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, Charles Yi Subject: [PATCH V3] usb: gadget: f_uac1: add adaptive sync support for capture Date: Thu, 26 Oct 2023 14:33:13 +0800 Message-Id: <20231026063313.1574618-1-be286@163.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-CM-TRANSID: _____wD3P0lFCDplUGTZAw--.45306S2 X-Coremail-Antispam: 1Uf129KBjvJXoWxuFW7KF1kKFyxAr48tF15CFg_yoW7GFykpw 1UC3yIkr45ArW3Jr48JFWruF43CFWxGry8GrW7Ww4FganFy3sava42yrWFkFy7JFyrZw4I qF4Fgw1a93ykCrJanT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x0pRn2-nUUUUU= X-Originating-IP: [171.83.45.213] X-CM-SenderInfo: dehsmli6rwjhhfrp/1tbiWwcV0mI0cg5OXAAAsj X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,RCVD_IN_DNSWL_BLOCKED,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (snail.vger.email [0.0.0.0]); Wed, 25 Oct 2023 23:34:07 -0700 (PDT) UAC1 has it's own freerunning clock and can update Host about real clock frequency through feedback endpoint so Host can align number of samples sent to the UAC1 to prevent overruns/underruns. Change UAC1 driver to make it configurable through additional 'c_sync' configfs file. Default remains 'adaptive' with possibility to switch it to 'asynchronous'. Signed-off-by: Charles Yi --------- Changes in V3: - Changed sync mode of capture to adaptive as default. - Added implement of 'c_sync' through configfs file. --------- Changes in V2: - Updated the indentation of commit message. --------- --- drivers/usb/gadget/function/f_uac1.c | 32 ++++++++++++++++++++++++++++ drivers/usb/gadget/function/u_uac1.h | 2 ++ 2 files changed, 34 insertions(+) diff --git a/drivers/usb/gadget/function/f_uac1.c b/drivers/usb/gadget/function/f_uac1.c index 6f0e1d803dc2..edf3c50766b8 100644 --- a/drivers/usb/gadget/function/f_uac1.c +++ b/drivers/usb/gadget/function/f_uac1.c @@ -33,6 +33,8 @@ #define FUOUT_EN(_opts) ((_opts)->c_mute_present \ || (_opts)->c_volume_present) +#define EPOUT_FBACK_IN_EN(_opts) ((_opts)->c_sync == USB_ENDPOINT_SYNC_ASYNC) + struct f_uac1 { struct g_audio g_audio; u8 ac_intf, as_in_intf, as_out_intf; @@ -227,6 +229,16 @@ static struct uac_iso_endpoint_descriptor as_iso_out_desc = { .wLockDelay = cpu_to_le16(1), }; +static struct usb_endpoint_descriptor as_fback_ep_desc = { + .bLength = USB_DT_ENDPOINT_SIZE, + .bDescriptorType = USB_DT_ENDPOINT, + + .bEndpointAddress = USB_DIR_IN, + .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_USAGE_FEEDBACK, + .wMaxPacketSize = cpu_to_le16(3), + .bInterval = 1, +}; + static struct uac_format_type_i_discrete_descriptor as_in_type_i_desc = { .bLength = 0, /* filled on rate setup */ .bDescriptorType = USB_DT_CS_INTERFACE, @@ -280,6 +292,7 @@ static struct usb_descriptor_header *f_audio_desc[] = { (struct usb_descriptor_header *)&as_out_ep_desc, (struct usb_descriptor_header *)&as_iso_out_desc, + (struct usb_descriptor_header *)&as_fback_ep_desc, (struct usb_descriptor_header *)&as_in_interface_alt_0_desc, (struct usb_descriptor_header *)&as_in_interface_alt_1_desc, @@ -1107,6 +1120,9 @@ static void setup_descriptor(struct f_uac1_opts *opts) f_audio_desc[i++] = USBDHDR(&as_out_type_i_desc); f_audio_desc[i++] = USBDHDR(&as_out_ep_desc); f_audio_desc[i++] = USBDHDR(&as_iso_out_desc); + if (EPOUT_FBACK_IN_EN(opts)) { + f_audio_desc[i++] = USBDHDR(&as_fback_ep_desc); + } } if (EPIN_EN(opts)) { f_audio_desc[i++] = USBDHDR(&as_in_interface_alt_0_desc); @@ -1317,6 +1333,12 @@ static int f_audio_bind(struct usb_configuration *c, struct usb_function *f) ac_header_desc->baInterfaceNr[ba_iface_id++] = status; uac1->as_out_intf = status; uac1->as_out_alt = 0; + + if (EPOUT_FBACK_IN_EN(audio_opts)) { + as_out_ep_desc.bmAttributes = + USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC; + as_out_interface_alt_1_desc.bNumEndpoints++; + } } if (EPIN_EN(audio_opts)) { @@ -1354,6 +1376,12 @@ static int f_audio_bind(struct usb_configuration *c, struct usb_function *f) goto err_free_fu; audio->out_ep = ep; audio->out_ep->desc = &as_out_ep_desc; + if (EPOUT_FBACK_IN_EN(audio_opts)) { + audio->in_ep_fback = usb_ep_autoconfig(gadget, &as_fback_ep_desc); + if (!audio->in_ep_fback) { + goto err_free_fu; + } + } } if (EPIN_EN(audio_opts)) { @@ -1596,6 +1624,7 @@ UAC1_ATTRIBUTE(u32, p_chmask); UAC1_RATE_ATTRIBUTE(p_srate); UAC1_ATTRIBUTE(u32, p_ssize); UAC1_ATTRIBUTE(u32, req_number); +UAC1_ATTRIBUTE(u32, c_sync); UAC1_ATTRIBUTE(bool, p_mute_present); UAC1_ATTRIBUTE(bool, p_volume_present); @@ -1618,6 +1647,7 @@ static struct configfs_attribute *f_uac1_attrs[] = { &f_uac1_opts_attr_p_srate, &f_uac1_opts_attr_p_ssize, &f_uac1_opts_attr_req_number, + &f_uac1_opts_attr_c_sync, &f_uac1_opts_attr_p_mute_present, &f_uac1_opts_attr_p_volume_present, @@ -1685,6 +1715,8 @@ static struct usb_function_instance *f_audio_alloc_inst(void) opts->req_number = UAC1_DEF_REQ_NUM; + opts->c_sync = UAC1_DEF_CSYNC; + snprintf(opts->function_name, sizeof(opts->function_name), "AC Interface"); return &opts->func_inst; diff --git a/drivers/usb/gadget/function/u_uac1.h b/drivers/usb/gadget/function/u_uac1.h index f7a616760e31..d0a4b86bff5c 100644 --- a/drivers/usb/gadget/function/u_uac1.h +++ b/drivers/usb/gadget/function/u_uac1.h @@ -27,6 +27,7 @@ #define UAC1_DEF_MAX_DB 0 /* 0 dB */ #define UAC1_DEF_RES_DB (1*256) /* 1 dB */ +#define UAC1_DEF_CSYNC USB_ENDPOINT_SYNC_ADAPTIVE struct f_uac1_opts { struct usb_function_instance func_inst; @@ -56,6 +57,7 @@ struct f_uac1_opts { struct mutex lock; int refcnt; + int c_sync; }; #endif /* __U_UAC1_H */ -- 2.34.1