From patchwork Thu Jun 23 15:54:25 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 102105 Delivered-To: patch@linaro.org Received: by 10.140.28.4 with SMTP id 4csp500837qgy; Thu, 23 Jun 2016 08:53:13 -0700 (PDT) X-Received: by 10.98.12.134 with SMTP id 6mr43787792pfm.15.1466697193386; Thu, 23 Jun 2016 08:53:13 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f6si681354pfa.18.2016.06.23.08.53.12; Thu, 23 Jun 2016 08:53:13 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751850AbcFWPxK (ORCPT + 30 others); Thu, 23 Jun 2016 11:53:10 -0400 Received: from mout.kundenserver.de ([212.227.126.130]:65438 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751770AbcFWPxH (ORCPT ); Thu, 23 Jun 2016 11:53:07 -0400 Received: from wuerfel.lan. ([78.42.132.4]) by mrelayeu.kundenserver.de (mreue003) with ESMTPA (Nemesis) id 0MdqUD-1azyYl3gFh-00Pgh2; Thu, 23 Jun 2016 17:52:47 +0200 From: Arnd Bergmann To: Felipe Balbi , Greg Kroah-Hartman Cc: Magnus Damm , Sebastian Reichel , Peter Chen , Paul Gortmaker , Arnd Bergmann , Ravi Teja Darbha , Felipe Balbi , devel@driverdev.osuosl.org, linux-kernel@vger.kernel.org Subject: [PATCH v2] staging: emxx_udc: allow modular build Date: Thu, 23 Jun 2016 17:54:25 +0200 Message-Id: <20160623155456.2267346-1-arnd@arndb.de> X-Mailer: git-send-email 2.9.0 X-Provags-ID: V03:K0:3XdrWwoL1y/v8c7XA5DKCoZeIQbhLyk4ipHHemcA+QM84uxv/i1 S67tA/3k5qGnT0BRlazGE7R59GGE7xiTyLwBV8wBATM7CVHD0STZDpJxzbcX7Ao3MFEnKSY SbovBBrQRcJRx++pXqupgZjCUfLNXzpyUcuiRtKw2cxIw/Dfs0Q24a/gyQKctklv7AD6Q6T t8EWo6Pj5Nwc2Da2vCHYQ== X-UI-Out-Filterresults: notjunk:1; V01:K0:gPu1euVucoc=:1wSBn0l+dBE6wwK5tWz8n+ yD/4MVkPqp6CyZ4k4XghMF2dHf+lEBoW4bDH7X7qdV6jgHCTI+J1WPK88YdJNRpvWzHwYHYSO s+Rjjdqk/gATzHWuqB7220OBf9twxRTIxq/hdAFWQf1SCFiEjW6OjlgiBNGXMjIwoOLY9wpHD Ri79Mb8Nup2Y7HyUi3Ynxo5o8xMP+aehtoLo164wzeprH0UtrGz/uwC3CD1wok8wPjGZwgWg/ R6MatUh9LquMuSLLv0nAKHMiCfj3GdL25VeUDVAAaqyv2uWWZkNXjQX88eTCcZWdlI/czl0w8 3y0UZGgzqrg6y/+09zzvwLbKn0iq0lO3jCgifnFnPkTZv95VskmwWjB5wOeWa7TLNdyVw3W9L f+P/ulGnEzmxuhk3uErF8o9KGn41Rbu27jOaWB29GWrzU9SVw5yFy68+W4QFpXo5ADk60W3uG D+HZKJWzzXGRD2kx1AQ+i+mKsTPnzUSIK4vOEAB0WJeTgfskaGiL8I4ug44hdcyknR/5YcilX Xlbn6laefaDOGFmDe3xqCBsSTtvrvrdE5PLP2Qq61nSvWS4O/Ri53aLA+ZNHDmc22CpOoCTiK 5msc+3MUPQ+5ObEn5JRNtoHlwuy+RC/+FES8bOmuP0C0CDEj1TG6S8IjmMV6BpxlLqhqmgnEA OrUG3OpfwRocswoS78A/UZ2AGv9YOAJxGSnjhGb8GszlCd67g3K+mcgu7fZ1oCQ1hBAA= Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org A change to the usb gadget core allowed certain API functions to be part of a loadable module, which breaks having emxx_udc built-in: drivers/staging/built-in.o: In function `nbu2ss_drv_probe': (.text+0x2428): undefined reference to `usb_ep_set_maxpacket_limit' The original patch already fixed tons of other cases that have the added dependency but apparently missed this one that now appears in an ARM allmodconfig build. This patch makes the symbol "tristate", which lets the Kconfig dependency tracking handle it correctly. To make the module actually usable, I also revert 0af61e66ee16 ("drivers/staging: make emxx_udc.c explicitly non-modular"), which Paul Gortmaker added after noticing that the Kconfig symbol was 'bool'. Compared to the original version however, I leave out the '__exit' annotation on the remove callback, as Paul pointed out that this was incorrect. Signed-off-by: Arnd Bergmann Fixes: 5a8d651a2bde ("usb: gadget: move gadget API functions to udc-core") --- drivers/staging/emxx_udc/Kconfig | 2 +- drivers/staging/emxx_udc/emxx_udc.c | 36 ++++++++++++++++++++++++++++++++---- 2 files changed, 33 insertions(+), 5 deletions(-) -- 2.9.0 diff --git a/drivers/staging/emxx_udc/Kconfig b/drivers/staging/emxx_udc/Kconfig index cc3402020487..d7577096fb25 100644 --- a/drivers/staging/emxx_udc/Kconfig +++ b/drivers/staging/emxx_udc/Kconfig @@ -1,5 +1,5 @@ config USB_EMXX - bool "EMXX USB Function Device Controller" + tristate "EMXX USB Function Device Controller" depends on USB_GADGET && (ARCH_SHMOBILE || (ARM && COMPILE_TEST)) help The Emma Mobile series of SoCs from Renesas Electronics and diff --git a/drivers/staging/emxx_udc/emxx_udc.c b/drivers/staging/emxx_udc/emxx_udc.c index 3bd91758b2da..3b56b2826263 100644 --- a/drivers/staging/emxx_udc/emxx_udc.c +++ b/drivers/staging/emxx_udc/emxx_udc.c @@ -15,7 +15,7 @@ */ #include -#include +#include #include #include #include @@ -39,9 +39,11 @@ #include "emxx_udc.h" +#define DRIVER_DESC "EMXX UDC driver" #define DMA_ADDR_INVALID (~(dma_addr_t)0) static const char driver_name[] = "emxx_udc"; +static const char driver_desc[] = DRIVER_DESC; /*===========================================================================*/ /* Prototype */ @@ -3296,6 +3298,28 @@ static void nbu2ss_drv_shutdown(struct platform_device *pdev) } /*-------------------------------------------------------------------------*/ +static int nbu2ss_drv_remove(struct platform_device *pdev) +{ + struct nbu2ss_udc *udc; + struct nbu2ss_ep *ep; + int i; + + udc = &udc_controller; + + for (i = 0; i < NUM_ENDPOINTS; i++) { + ep = &udc->ep[i]; + if (ep->virt_buf) + dma_free_coherent(NULL, PAGE_SIZE, + (void *)ep->virt_buf, ep->phys_buf); + } + + /* Interrupt Handler - Release */ + free_irq(INT_VBUS, udc); + + return 0; +} + +/*-------------------------------------------------------------------------*/ static int nbu2ss_drv_suspend(struct platform_device *pdev, pm_message_t state) { struct nbu2ss_udc *udc; @@ -3347,12 +3371,16 @@ static int nbu2ss_drv_resume(struct platform_device *pdev) static struct platform_driver udc_driver = { .probe = nbu2ss_drv_probe, .shutdown = nbu2ss_drv_shutdown, + .remove = nbu2ss_drv_remove, .suspend = nbu2ss_drv_suspend, .resume = nbu2ss_drv_resume, .driver = { - .name = driver_name, - .suppress_bind_attrs = true, + .name = driver_name, }, }; -builtin_platform_driver(udc_driver); +module_platform_driver(udc_driver); + +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_AUTHOR("Renesas Electronics Corporation"); +MODULE_LICENSE("GPL");