From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932410AbcECDQJ (ORCPT ); Mon, 2 May 2016 23:16:09 -0400 Received: from mga14.intel.com ([192.55.52.115]:61811 "EHLO mga14.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755238AbcECDQC (ORCPT ); Mon, 2 May 2016 23:16:02 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,570,1455004800"; d="scan'208";a="96028571" From: changbin.du@intel.com To: balbi@kernel.org Cc: gregkh@linuxfoundation.org, corbet@lwn.net, linux-usb@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, "Du, Changbin" , Du@vger.kernel.org, Changbin Subject: [PATCH 1/2] usb: configfs: allow UDC binding rule configured as binding to *any* UDC Date: Tue, 3 May 2016 11:04:24 +0800 Message-Id: <1462244665-27681-2-git-send-email-changbin.du@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1462244665-27681-1-git-send-email-changbin.du@intel.com> References: <1462244665-27681-1-git-send-email-changbin.du@intel.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: "Du, Changbin" On most platforms, there is only one device controller available. In this case, we desn't care the UDC's name. So let's ignore the name by setting 'UDC' to 'any'. And also we can change UDC name at any time if it is not binded (no need set to "" first). Signed-off-by: Du, Changbin Signed-off-by: Du, Changbin --- drivers/usb/gadget/configfs.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/drivers/usb/gadget/configfs.c b/drivers/usb/gadget/configfs.c index b6f60ca..5da2991 100644 --- a/drivers/usb/gadget/configfs.c +++ b/drivers/usb/gadget/configfs.c @@ -230,16 +230,18 @@ static ssize_t gadget_dev_desc_bcdUSB_store(struct config_item *item, static ssize_t gadget_dev_desc_UDC_show(struct config_item *item, char *page) { - char *udc_name = to_gadget_info(item)->composite.gadget_driver.udc_name; + struct gadget_info *gi = to_gadget_info(item); + char *udc_name = gi->composite.gadget_driver.udc_name; - return sprintf(page, "%s\n", udc_name ?: ""); + return sprintf(page, "%s\n", udc_name ?: + (gi->cdev.gadget ? "any" : "")); } static int unregister_gadget(struct gadget_info *gi) { int ret; - if (!gi->composite.gadget_driver.udc_name) + if (!gi->cdev.gadget) return -ENODEV; ret = usb_gadget_unregister_driver(&gi->composite.gadget_driver); @@ -270,10 +272,14 @@ static ssize_t gadget_dev_desc_UDC_store(struct config_item *item, if (ret) goto err; } else { - if (gi->composite.gadget_driver.udc_name) { + if (gi->cdev.gadget) { ret = -EBUSY; goto err; } + if (!strcmp(name, "any")) { + kfree(name); + name = NULL; + } gi->composite.gadget_driver.udc_name = name; ret = usb_gadget_probe_driver(&gi->composite.gadget_driver); if (ret) { @@ -428,9 +434,9 @@ static int config_usb_cfg_unlink( * remove the function. */ mutex_lock(&gi->lock); - if (gi->composite.gadget_driver.udc_name) + if (gi->cdev.gadget) unregister_gadget(gi); - WARN_ON(gi->composite.gadget_driver.udc_name); + WARN_ON(gi->cdev.gadget); list_for_each_entry(f, &cfg->func_list, list) { if (f->fi == fi) { @@ -873,10 +879,10 @@ static int os_desc_unlink(struct config_item *os_desc_ci, struct usb_composite_dev *cdev = &gi->cdev; mutex_lock(&gi->lock); - if (gi->composite.gadget_driver.udc_name) + if (gi->cdev.gadget) unregister_gadget(gi); cdev->os_desc_config = NULL; - WARN_ON(gi->composite.gadget_driver.udc_name); + WARN_ON(gi->cdev.gadget); mutex_unlock(&gi->lock); return 0; } -- 2.7.4