Commit 0bf048ab authored by Arnd Bergmann's avatar Arnd Bergmann Committed by Greg Kroah-Hartman

staging: emxx_udc: allow modular build

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 0af61e66 ("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: default avatarArnd Bergmann <arnd@arndb.de>
Fixes: 5a8d651a ("usb: gadget: move gadget API functions to udc-core")
Acked-by: default avatarFelipe Balbi <felipe.balbi@linux.intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 71da2ba2
config USB_EMXX config USB_EMXX
bool "EMXX USB Function Device Controller" tristate "EMXX USB Function Device Controller"
depends on USB_GADGET && (ARCH_SHMOBILE || (ARM && COMPILE_TEST)) depends on USB_GADGET && (ARCH_SHMOBILE || (ARM && COMPILE_TEST))
help help
The Emma Mobile series of SoCs from Renesas Electronics and The Emma Mobile series of SoCs from Renesas Electronics and
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/init.h> #include <linux/module.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/ioport.h> #include <linux/ioport.h>
...@@ -39,9 +39,11 @@ ...@@ -39,9 +39,11 @@
#include "emxx_udc.h" #include "emxx_udc.h"
#define DRIVER_DESC "EMXX UDC driver"
#define DMA_ADDR_INVALID (~(dma_addr_t)0) #define DMA_ADDR_INVALID (~(dma_addr_t)0)
static const char driver_name[] = "emxx_udc"; static const char driver_name[] = "emxx_udc";
static const char driver_desc[] = DRIVER_DESC;
/*===========================================================================*/ /*===========================================================================*/
/* Prototype */ /* Prototype */
...@@ -3295,6 +3297,28 @@ static void nbu2ss_drv_shutdown(struct platform_device *pdev) ...@@ -3295,6 +3297,28 @@ static void nbu2ss_drv_shutdown(struct platform_device *pdev)
_nbu2ss_disable_controller(udc); _nbu2ss_disable_controller(udc);
} }
/*-------------------------------------------------------------------------*/
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) static int nbu2ss_drv_suspend(struct platform_device *pdev, pm_message_t state)
{ {
...@@ -3347,12 +3371,16 @@ static int nbu2ss_drv_resume(struct platform_device *pdev) ...@@ -3347,12 +3371,16 @@ static int nbu2ss_drv_resume(struct platform_device *pdev)
static struct platform_driver udc_driver = { static struct platform_driver udc_driver = {
.probe = nbu2ss_drv_probe, .probe = nbu2ss_drv_probe,
.shutdown = nbu2ss_drv_shutdown, .shutdown = nbu2ss_drv_shutdown,
.remove = nbu2ss_drv_remove,
.suspend = nbu2ss_drv_suspend, .suspend = nbu2ss_drv_suspend,
.resume = nbu2ss_drv_resume, .resume = nbu2ss_drv_resume,
.driver = { .driver = {
.name = driver_name, .name = driver_name,
.suppress_bind_attrs = true,
}, },
}; };
builtin_platform_driver(udc_driver); module_platform_driver(udc_driver);
MODULE_DESCRIPTION(DRIVER_DESC);
MODULE_AUTHOR("Renesas Electronics Corporation");
MODULE_LICENSE("GPL");
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment