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

Commit aa074739 authored by Sebastian Andrzej Siewior's avatar Sebastian Andrzej Siewior Committed by Greg Kroah-Hartman
Browse files

usb: gadget: dummy_hcd: convert to new-style udc-probe



bind() and pull is moved to udc core, call callbacks are verified by the
upper layer.

Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent e71eb392
Loading
Loading
Loading
Loading
+15 −35
Original line number Diff line number Diff line
@@ -857,17 +857,18 @@ static int dummy_pullup (struct usb_gadget *_gadget, int value)
	return 0;
}

static int dummy_udc_start(struct usb_gadget_driver *driver,
		int (*bind)(struct usb_gadget *));
static int dummy_udc_stop(struct usb_gadget_driver *driver);
static int dummy_udc_start(struct usb_gadget *g,
		struct usb_gadget_driver *driver);
static int dummy_udc_stop(struct usb_gadget *g,
		struct usb_gadget_driver *driver);

static const struct usb_gadget_ops dummy_ops = {
	.get_frame	= dummy_g_get_frame,
	.wakeup		= dummy_wakeup,
	.set_selfpowered = dummy_set_selfpowered,
	.pullup		= dummy_pullup,
	.start		= dummy_udc_start,
	.stop		= dummy_udc_stop,
	.udc_start	= dummy_udc_start,
	.udc_stop	= dummy_udc_stop,
};

/*-------------------------------------------------------------------------*/
@@ -900,17 +901,13 @@ static DEVICE_ATTR (function, S_IRUGO, show_function, NULL);
 * for each driver that registers:  just add to a big root hub.
 */

static int dummy_udc_start(struct usb_gadget_driver *driver,
		int (*bind)(struct usb_gadget *))
static int dummy_udc_start(struct usb_gadget *g,
		struct usb_gadget_driver *driver)
{
	struct dummy	*dum = &the_controller;
	int		retval;
	struct dummy_hcd	*dum_hcd = gadget_to_dummy_hcd(g);
	struct dummy		*dum = dum_hcd->dum;

	if (!dum)
		return -EINVAL;
	if (dum->driver)
		return -EBUSY;
	if (!bind || !driver->setup || driver->speed == USB_SPEED_UNKNOWN)
	if (driver->speed == USB_SPEED_UNKNOWN)
		return -EINVAL;

	/*
@@ -921,37 +918,20 @@ static int dummy_udc_start(struct usb_gadget_driver *driver,
	dum->devstatus = 0;

	dum->driver = driver;
	dum->gadget.dev.driver = &driver->driver;
	dev_dbg (udc_dev(dum), "binding gadget driver '%s'\n",
			driver->driver.name);
	retval = bind(&dum->gadget);
	if (retval) {
		dum->driver = NULL;
		dum->gadget.dev.driver = NULL;
		return retval;
	}

	/* khubd will enumerate this in a while */
	dummy_pullup(&dum->gadget, 1);
	return 0;
}

static int dummy_udc_stop(struct usb_gadget_driver *driver)
static int dummy_udc_stop(struct usb_gadget *g,
		struct usb_gadget_driver *driver)
{
	struct dummy	*dum = &the_controller;

	if (!dum)
		return -ENODEV;
	if (!driver || driver != dum->driver || !driver->unbind)
		return -EINVAL;
	struct dummy_hcd	*dum_hcd = gadget_to_dummy_hcd(g);
	struct dummy		*dum = dum_hcd->dum;

	dev_dbg (udc_dev(dum), "unregister gadget driver '%s'\n",
			driver->driver.name);

	dummy_pullup(&dum->gadget, 0);

	driver->unbind (&dum->gadget);
	dum->gadget.dev.driver = NULL;
	dum->driver = NULL;

	dummy_pullup(&dum->gadget, 0);