From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757754AbcBCMxq (ORCPT ); Wed, 3 Feb 2016 07:53:46 -0500 Received: from mailout2.samsung.com ([203.254.224.25]:60660 "EHLO mailout2.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756461AbcBCMks (ORCPT ); Wed, 3 Feb 2016 07:40:48 -0500 X-AuditID: cbfee61a-f79266d000003652-d6-56b1f54d71d8 From: Robert Baldyga To: balbi@ti.com Cc: gregkh@linuxfoundation.org, andrzej.p@samsung.com, m.szyprowski@samsung.com, b.zolnierkie@samsung.com, linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, Robert Baldyga Subject: [PATCH v4 12/43] usb: gadget: composite: disable eps before calling disable() callback Date: Wed, 03 Feb 2016 13:39:20 +0100 Message-id: <1454503191-11796-13-git-send-email-r.baldyga@samsung.com> X-Mailer: git-send-email 1.9.1 In-reply-to: <1454503191-11796-1-git-send-email-r.baldyga@samsung.com> References: <1454503191-11796-1-git-send-email-r.baldyga@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprKLMWRmVeSWpSXmKPExsVy+t9jQV3frxvDDJ49ULWY9bKdxWLjjPWs Fgfv11s0L17PZnF51xw2i0XLWpkt1h65y27x4PBOdgcOj/1z17B79G1Zxehx/MZ2Jo/Pm+QC WKK4bFJSczLLUov07RK4MnrW97IVnBCuaD9yj6WBcbpAFyMnh4SAicThhdfZIGwxiQv31gPZ XBxCArMYJS5MvcAE4fxklHj5+yQrSBWbgI7Elu8TGEFsEQEBifUvLrGDFDELnGOUeHinDSjB wSEskCix64gWSA2LgKrE+vZGdhCbV8BNYtW6JywQ2+QkTh6bzApSzgkUf3jMASQsJOAqsav1 O+MERt4FjAyrGCVSC5ILipPScw3zUsv1ihNzi0vz0vWS83M3MYID65nUDsaDu9wPMQpwMCrx 8DL82BAmxJpYVlyZe4hRgoNZSYTX6PPGMCHelMTKqtSi/Pii0pzU4kOM0hwsSuK8j/+vCxMS SE8sSc1OTS1ILYLJMnFwSjUwzunRfG1/Vva3/kOtzBkMARuef5jc+SK095Wtfn/zghO6X96L rj+vd/F89taff8warR7My4/46zy7ckL56het0Q73Vvo7zch4ob//t4qhTnRYQOh3K3arW5ue VtzxytH3Uv70f0s454KdW90llb2ED99ze/rJ5PsscYm9zbcWX1fLOn9FsXBzgxJLcUaioRZz UXEiAIXBsn4oAgAA Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Changes meaning of disable() operation for functions using new API. Before calling disable() callback composite automatically disables endpoints of active altsettings of given USB function. This reduces amount of boilerplate code in USB functions. Signed-off-by: Robert Baldyga --- drivers/usb/gadget/composite.c | 51 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 44 insertions(+), 7 deletions(-) diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c index c34725b..f2c08b3 100644 --- a/drivers/usb/gadget/composite.c +++ b/drivers/usb/gadget/composite.c @@ -246,12 +246,12 @@ done: } EXPORT_SYMBOL_GPL(usb_add_function); +static void disable_function(struct usb_function *f); + void usb_remove_function(struct usb_configuration *c, struct usb_function *f) { - if (f->disable) - f->disable(f); + disable_function(f); - bitmap_zero(f->endpoints, 32); list_del(&f->list); if (f->unbind) f->unbind(c, f); @@ -942,6 +942,46 @@ static void device_qual(struct usb_composite_dev *cdev) /*-------------------------------------------------------------------------*/ +/** + * disable_interface - disable all endpoints in given interface + * @f: USB function + * @i: interface index in function + */ +static void disable_interface(struct usb_function *f, unsigned i) +{ + struct usb_composite_intf *intf; + struct usb_composite_altset *alt; + int e; + + intf = f->descs->intfs[i]; + if (intf->cur_altset < 0) + return; + + alt = intf->altsets[intf->cur_altset]; + for (e = 0; e < alt->eps_num; ++e) + usb_ep_disable(alt->eps[e]->ep); + + intf->cur_altset = -1; +} + +/** + * disable_function - disable all endpoints in given function + * @f: USB function + */ +static void disable_function(struct usb_function *f) +{ + int i; + + if (usb_function_is_new_api(f)) + for (i = 0; i < f->descs->intfs_num; ++i) + disable_interface(f, i); + + if (f->disable) + f->disable(f); + + bitmap_zero(f->endpoints, 32); +} + static void reset_config(struct usb_composite_dev *cdev) { struct usb_function *f; @@ -949,10 +989,7 @@ static void reset_config(struct usb_composite_dev *cdev) DBG(cdev, "reset config\n"); list_for_each_entry(f, &cdev->config->functions, list) { - if (f->disable) - f->disable(f); - - bitmap_zero(f->endpoints, 32); + disable_function(f); } cdev->config = NULL; cdev->delayed_status = 0; -- 1.9.1