Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b0fca50f authored by Uwe Kleine-König's avatar Uwe Kleine-König Committed by Greg Kroah-Hartman
Browse files

usb gadget: don't save bind callback in struct usb_gadget_driver



To accomplish this the function to register a gadget driver takes the bind
function as a second argument.  To make things clearer rename the function
to resemble platform_driver_probe.

This fixes many section mismatches like

	WARNING: drivers/usb/gadget/g_printer.o(.data+0xc): Section mismatch in
	reference from the variable printer_driver to the function
	.init.text:printer_bind()
	The variable printer_driver references
	the function __init printer_bind()

All callers are fixed.

Signed-off-by: default avatarUwe Kleine-König <u.kleine-koenig@pengutronix.de>
[m.nazarewicz@samsung.com: added dbgp]
Signed-off-by: default avatarMichał Nazarewicz <m.nazarewicz@samsung.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent e12995ec
Loading
Loading
Loading
Loading
+5 −4
Original line number Original line Diff line number Diff line
@@ -1954,13 +1954,14 @@ static int setup_ep0(struct udc *dev)
}
}


/* Called by gadget driver to register itself */
/* Called by gadget driver to register itself */
int usb_gadget_register_driver(struct usb_gadget_driver *driver)
int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
		int (*bind)(struct usb_gadget *))
{
{
	struct udc		*dev = udc;
	struct udc		*dev = udc;
	int			retval;
	int			retval;
	u32 tmp;
	u32 tmp;


	if (!driver || !driver->bind || !driver->setup
	if (!driver || !bind || !driver->setup
			|| driver->speed != USB_SPEED_HIGH)
			|| driver->speed != USB_SPEED_HIGH)
		return -EINVAL;
		return -EINVAL;
	if (!dev)
	if (!dev)
@@ -1972,7 +1973,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)
	dev->driver = driver;
	dev->driver = driver;
	dev->gadget.dev.driver = &driver->driver;
	dev->gadget.dev.driver = &driver->driver;


	retval = driver->bind(&dev->gadget);
	retval = bind(&dev->gadget);


	/* Some gadget drivers use both ep0 directions.
	/* Some gadget drivers use both ep0 directions.
	 * NOTE: to gadget driver, ep0 is just one endpoint...
	 * NOTE: to gadget driver, ep0 is just one endpoint...
@@ -2000,7 +2001,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)


	return 0;
	return 0;
}
}
EXPORT_SYMBOL(usb_gadget_register_driver);
EXPORT_SYMBOL(usb_gadget_probe_driver);


/* shutdown requests and disconnect from gadget */
/* shutdown requests and disconnect from gadget */
static void
static void
+6 −5
Original line number Original line Diff line number Diff line
@@ -1628,7 +1628,8 @@ static void at91_vbus_timer(unsigned long data)
		schedule_work(&udc->vbus_timer_work);
		schedule_work(&udc->vbus_timer_work);
}
}


int usb_gadget_register_driver (struct usb_gadget_driver *driver)
int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
		int (*bind)(struct usb_gadget *))
{
{
	struct at91_udc	*udc = &controller;
	struct at91_udc	*udc = &controller;
	int		retval;
	int		retval;
@@ -1636,7 +1637,7 @@ int usb_gadget_register_driver (struct usb_gadget_driver *driver)


	if (!driver
	if (!driver
			|| driver->speed < USB_SPEED_FULL
			|| driver->speed < USB_SPEED_FULL
			|| !driver->bind
			|| !bind
			|| !driver->setup) {
			|| !driver->setup) {
		DBG("bad parameter.\n");
		DBG("bad parameter.\n");
		return -EINVAL;
		return -EINVAL;
@@ -1653,9 +1654,9 @@ int usb_gadget_register_driver (struct usb_gadget_driver *driver)
	udc->enabled = 1;
	udc->enabled = 1;
	udc->selfpowered = 1;
	udc->selfpowered = 1;


	retval = driver->bind(&udc->gadget);
	retval = bind(&udc->gadget);
	if (retval) {
	if (retval) {
		DBG("driver->bind() returned %d\n", retval);
		DBG("bind() returned %d\n", retval);
		udc->driver = NULL;
		udc->driver = NULL;
		udc->gadget.dev.driver = NULL;
		udc->gadget.dev.driver = NULL;
		dev_set_drvdata(&udc->gadget.dev, NULL);
		dev_set_drvdata(&udc->gadget.dev, NULL);
@@ -1671,7 +1672,7 @@ int usb_gadget_register_driver (struct usb_gadget_driver *driver)
	DBG("bound to %s\n", driver->driver.name);
	DBG("bound to %s\n", driver->driver.name);
	return 0;
	return 0;
}
}
EXPORT_SYMBOL (usb_gadget_register_driver);
EXPORT_SYMBOL(usb_gadget_probe_driver);


int usb_gadget_unregister_driver (struct usb_gadget_driver *driver)
int usb_gadget_unregister_driver (struct usb_gadget_driver *driver)
{
{
+4 −3
Original line number Original line Diff line number Diff line
@@ -1789,7 +1789,8 @@ static irqreturn_t usba_vbus_irq(int irq, void *devid)
	return IRQ_HANDLED;
	return IRQ_HANDLED;
}
}


int usb_gadget_register_driver(struct usb_gadget_driver *driver)
int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
		int (*bind)(struct usb_gadget *))
{
{
	struct usba_udc *udc = &the_udc;
	struct usba_udc *udc = &the_udc;
	unsigned long flags;
	unsigned long flags;
@@ -1812,7 +1813,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)
	clk_enable(udc->pclk);
	clk_enable(udc->pclk);
	clk_enable(udc->hclk);
	clk_enable(udc->hclk);


	ret = driver->bind(&udc->gadget);
	ret = bind(&udc->gadget);
	if (ret) {
	if (ret) {
		DBG(DBG_ERR, "Could not bind to driver %s: error %d\n",
		DBG(DBG_ERR, "Could not bind to driver %s: error %d\n",
			driver->driver.name, ret);
			driver->driver.name, ret);
@@ -1841,7 +1842,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)
	udc->gadget.dev.driver = NULL;
	udc->gadget.dev.driver = NULL;
	return ret;
	return ret;
}
}
EXPORT_SYMBOL(usb_gadget_register_driver);
EXPORT_SYMBOL(usb_gadget_probe_driver);


int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
{
{
+10 −8
Original line number Original line Diff line number Diff line
@@ -2340,12 +2340,15 @@ static const struct usb_ep_ops usb_ep_ops = {
static const struct usb_gadget_ops usb_gadget_ops;
static const struct usb_gadget_ops usb_gadget_ops;


/**
/**
 * usb_gadget_register_driver: register a gadget driver
 * usb_gadget_probe_driver: register a gadget driver
 * @driver: the driver being registered
 * @bind: the driver's bind callback
 *
 *
 * Check usb_gadget_register_driver() at "usb_gadget.h" for details
 * Check usb_gadget_probe_driver() at <linux/usb/gadget.h> for details.
 * Interrupts are enabled here
 * Interrupts are enabled here.
 */
 */
int usb_gadget_register_driver(struct usb_gadget_driver *driver)
int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
		int (*bind)(struct usb_gadget *))
{
{
	struct ci13xxx *udc = _udc;
	struct ci13xxx *udc = _udc;
	unsigned long i, k, flags;
	unsigned long i, k, flags;
@@ -2354,7 +2357,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)
	trace("%p", driver);
	trace("%p", driver);


	if (driver             == NULL ||
	if (driver             == NULL ||
	    driver->bind       == NULL ||
	    bind               == NULL ||
	    driver->unbind     == NULL ||
	    driver->unbind     == NULL ||
	    driver->setup      == NULL ||
	    driver->setup      == NULL ||
	    driver->disconnect == NULL ||
	    driver->disconnect == NULL ||
@@ -2430,7 +2433,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)
	udc->gadget.dev.driver = &driver->driver;
	udc->gadget.dev.driver = &driver->driver;


	spin_unlock_irqrestore(udc->lock, flags);
	spin_unlock_irqrestore(udc->lock, flags);
	retval = driver->bind(&udc->gadget);                /* MAY SLEEP */
	retval = bind(&udc->gadget);                /* MAY SLEEP */
	spin_lock_irqsave(udc->lock, flags);
	spin_lock_irqsave(udc->lock, flags);


	if (retval) {
	if (retval) {
@@ -2447,7 +2450,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)
		usb_gadget_unregister_driver(driver);
		usb_gadget_unregister_driver(driver);
	return retval;
	return retval;
}
}
EXPORT_SYMBOL(usb_gadget_register_driver);
EXPORT_SYMBOL(usb_gadget_probe_driver);


/**
/**
 * usb_gadget_unregister_driver: unregister a gadget driver
 * usb_gadget_unregister_driver: unregister a gadget driver
@@ -2462,7 +2465,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
	trace("%p", driver);
	trace("%p", driver);


	if (driver             == NULL ||
	if (driver             == NULL ||
	    driver->bind       == NULL ||
	    driver->unbind     == NULL ||
	    driver->unbind     == NULL ||
	    driver->setup      == NULL ||
	    driver->setup      == NULL ||
	    driver->disconnect == NULL ||
	    driver->disconnect == NULL ||
+1 −2
Original line number Original line Diff line number Diff line
@@ -1213,7 +1213,6 @@ composite_resume(struct usb_gadget *gadget)
static struct usb_gadget_driver composite_driver = {
static struct usb_gadget_driver composite_driver = {
	.speed		= USB_SPEED_HIGH,
	.speed		= USB_SPEED_HIGH,


	.bind		= composite_bind,
	.unbind		= composite_unbind,
	.unbind		= composite_unbind,


	.setup		= composite_setup,
	.setup		= composite_setup,
@@ -1255,7 +1254,7 @@ int usb_composite_register(struct usb_composite_driver *driver)
	composite_driver.driver.name = driver->name;
	composite_driver.driver.name = driver->name;
	composite = driver;
	composite = driver;


	return usb_gadget_register_driver(&composite_driver);
	return usb_gadget_probe_driver(&composite_driver, composite_bind);
}
}


/**
/**
Loading