|
|
@@ -1463,42 +1463,16 @@ static struct usb_ep_ops m66592_ep_ops = {
|
|
|
};
|
|
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
|
-static struct m66592 *the_controller;
|
|
|
-
|
|
|
-static int m66592_start(struct usb_gadget_driver *driver,
|
|
|
- int (*bind)(struct usb_gadget *, struct usb_gadget_driver *))
|
|
|
+static int m66592_udc_start(struct usb_gadget *g,
|
|
|
+ struct usb_gadget_driver *driver)
|
|
|
{
|
|
|
- struct m66592 *m66592 = the_controller;
|
|
|
- int retval;
|
|
|
-
|
|
|
- if (!driver
|
|
|
- || driver->max_speed < USB_SPEED_HIGH
|
|
|
- || !bind
|
|
|
- || !driver->setup)
|
|
|
- return -EINVAL;
|
|
|
- if (!m66592)
|
|
|
- return -ENODEV;
|
|
|
- if (m66592->driver)
|
|
|
- return -EBUSY;
|
|
|
+ struct m66592 *m66592 = to_m66592(g);
|
|
|
|
|
|
/* hook up the driver */
|
|
|
driver->driver.bus = NULL;
|
|
|
m66592->driver = driver;
|
|
|
m66592->gadget.dev.driver = &driver->driver;
|
|
|
|
|
|
- retval = device_add(&m66592->gadget.dev);
|
|
|
- if (retval) {
|
|
|
- pr_err("device_add error (%d)\n", retval);
|
|
|
- goto error;
|
|
|
- }
|
|
|
-
|
|
|
- retval = bind(&m66592->gadget, driver);
|
|
|
- if (retval) {
|
|
|
- pr_err("bind to driver error (%d)\n", retval);
|
|
|
- device_del(&m66592->gadget.dev);
|
|
|
- goto error;
|
|
|
- }
|
|
|
-
|
|
|
m66592_bset(m66592, M66592_VBSE | M66592_URST, M66592_INTENB0);
|
|
|
if (m66592_read(m66592, M66592_INTSTS0) & M66592_VBSTS) {
|
|
|
m66592_start_xclock(m66592);
|
|
|
@@ -1510,26 +1484,12 @@ static int m66592_start(struct usb_gadget_driver *driver,
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
-
|
|
|
-error:
|
|
|
- m66592->driver = NULL;
|
|
|
- m66592->gadget.dev.driver = NULL;
|
|
|
-
|
|
|
- return retval;
|
|
|
}
|
|
|
|
|
|
-static int m66592_stop(struct usb_gadget_driver *driver)
|
|
|
+static int m66592_udc_stop(struct usb_gadget *g,
|
|
|
+ struct usb_gadget_driver *driver)
|
|
|
{
|
|
|
- struct m66592 *m66592 = the_controller;
|
|
|
- unsigned long flags;
|
|
|
-
|
|
|
- if (driver != m66592->driver || !driver->unbind)
|
|
|
- return -EINVAL;
|
|
|
-
|
|
|
- spin_lock_irqsave(&m66592->lock, flags);
|
|
|
- if (m66592->gadget.speed != USB_SPEED_UNKNOWN)
|
|
|
- m66592_usb_disconnect(m66592);
|
|
|
- spin_unlock_irqrestore(&m66592->lock, flags);
|
|
|
+ struct m66592 *m66592 = to_m66592(g);
|
|
|
|
|
|
m66592_bclr(m66592, M66592_VBSE | M66592_URST, M66592_INTENB0);
|
|
|
|
|
|
@@ -1539,8 +1499,8 @@ static int m66592_stop(struct usb_gadget_driver *driver)
|
|
|
init_controller(m66592);
|
|
|
disable_controller(m66592);
|
|
|
|
|
|
- device_del(&m66592->gadget.dev);
|
|
|
m66592->driver = NULL;
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
@@ -1568,8 +1528,8 @@ static int m66592_pullup(struct usb_gadget *gadget, int is_on)
|
|
|
|
|
|
static struct usb_gadget_ops m66592_gadget_ops = {
|
|
|
.get_frame = m66592_get_frame,
|
|
|
- .start = m66592_start,
|
|
|
- .stop = m66592_stop,
|
|
|
+ .udc_start = m66592_udc_start,
|
|
|
+ .udc_stop = m66592_udc_stop,
|
|
|
.pullup = m66592_pullup,
|
|
|
};
|
|
|
|
|
|
@@ -1578,6 +1538,7 @@ static int __exit m66592_remove(struct platform_device *pdev)
|
|
|
struct m66592 *m66592 = dev_get_drvdata(&pdev->dev);
|
|
|
|
|
|
usb_del_gadget_udc(&m66592->gadget);
|
|
|
+ device_del(&m66592->gadget.dev);
|
|
|
|
|
|
del_timer_sync(&m66592->timer);
|
|
|
iounmap(m66592->reg);
|
|
|
@@ -1706,8 +1667,6 @@ static int __init m66592_probe(struct platform_device *pdev)
|
|
|
m66592->pipenum2ep[0] = &m66592->ep[0];
|
|
|
m66592->epaddr2ep[0] = &m66592->ep[0];
|
|
|
|
|
|
- the_controller = m66592;
|
|
|
-
|
|
|
m66592->ep0_req = m66592_alloc_request(&m66592->ep[0].ep, GFP_KERNEL);
|
|
|
if (m66592->ep0_req == NULL)
|
|
|
goto clean_up3;
|
|
|
@@ -1715,6 +1674,12 @@ static int __init m66592_probe(struct platform_device *pdev)
|
|
|
|
|
|
init_controller(m66592);
|
|
|
|
|
|
+ ret = device_add(&m66592->gadget.dev);
|
|
|
+ if (ret) {
|
|
|
+ pr_err("device_add error (%d)\n", ret);
|
|
|
+ goto err_device_add;
|
|
|
+ }
|
|
|
+
|
|
|
ret = usb_add_gadget_udc(&pdev->dev, &m66592->gadget);
|
|
|
if (ret)
|
|
|
goto err_add_udc;
|
|
|
@@ -1723,6 +1688,9 @@ static int __init m66592_probe(struct platform_device *pdev)
|
|
|
return 0;
|
|
|
|
|
|
err_add_udc:
|
|
|
+ device_del(&m66592->gadget.dev);
|
|
|
+
|
|
|
+err_device_add:
|
|
|
m66592_free_request(&m66592->ep[0].ep, m66592->ep0_req);
|
|
|
|
|
|
clean_up3:
|