Commit aac16b63 authored by Chao Xie's avatar Chao Xie Committed by Felipe Balbi

usb: gadget: mv_udc: use udc_start and udc_stop functions

This patches converts the driver into the new style start/stop
interface. As a result the driver no longer uses the static
global the_conroller variable.
Signed-off-by: default avatarChao Xie <chao.xie@marvell.com>
Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
parent 38b3ad56
...@@ -61,9 +61,6 @@ static DECLARE_COMPLETION(release_done); ...@@ -61,9 +61,6 @@ static DECLARE_COMPLETION(release_done);
static const char driver_name[] = "mv_udc"; static const char driver_name[] = "mv_udc";
static const char driver_desc[] = DRIVER_DESC; static const char driver_desc[] = DRIVER_DESC;
/* controller device global variable */
static struct mv_udc *the_controller;
static void nuke(struct mv_ep *ep, int status); static void nuke(struct mv_ep *ep, int status);
static void stop_activity(struct mv_udc *udc, struct usb_gadget_driver *driver); static void stop_activity(struct mv_udc *udc, struct usb_gadget_driver *driver);
...@@ -1268,9 +1265,8 @@ static int mv_udc_pullup(struct usb_gadget *gadget, int is_on) ...@@ -1268,9 +1265,8 @@ static int mv_udc_pullup(struct usb_gadget *gadget, int is_on)
return retval; return retval;
} }
static int mv_udc_start(struct usb_gadget_driver *driver, static int mv_udc_start(struct usb_gadget *, struct usb_gadget_driver *);
int (*bind)(struct usb_gadget *, struct usb_gadget_driver *)); static int mv_udc_stop(struct usb_gadget *, struct usb_gadget_driver *);
static int mv_udc_stop(struct usb_gadget_driver *driver);
/* device controller usb_gadget_ops structure */ /* device controller usb_gadget_ops structure */
static const struct usb_gadget_ops mv_ops = { static const struct usb_gadget_ops mv_ops = {
...@@ -1285,8 +1281,8 @@ static const struct usb_gadget_ops mv_ops = { ...@@ -1285,8 +1281,8 @@ static const struct usb_gadget_ops mv_ops = {
/* D+ pullup, software-controlled connect/disconnect to USB host */ /* D+ pullup, software-controlled connect/disconnect to USB host */
.pullup = mv_udc_pullup, .pullup = mv_udc_pullup,
.start = mv_udc_start, .udc_start = mv_udc_start,
.stop = mv_udc_stop, .udc_stop = mv_udc_stop,
}; };
static int eps_init(struct mv_udc *udc) static int eps_init(struct mv_udc *udc)
...@@ -1373,15 +1369,14 @@ static void stop_activity(struct mv_udc *udc, struct usb_gadget_driver *driver) ...@@ -1373,15 +1369,14 @@ static void stop_activity(struct mv_udc *udc, struct usb_gadget_driver *driver)
} }
} }
static int mv_udc_start(struct usb_gadget_driver *driver, static int mv_udc_start(struct usb_gadget *gadget,
int (*bind)(struct usb_gadget *, struct usb_gadget_driver *)) struct usb_gadget_driver *driver)
{ {
struct mv_udc *udc = the_controller; struct mv_udc *udc;
int retval = 0; int retval = 0;
unsigned long flags; unsigned long flags;
if (!udc) udc = container_of(gadget, struct mv_udc, gadget);
return -ENODEV;
if (udc->driver) if (udc->driver)
return -EBUSY; return -EBUSY;
...@@ -1399,26 +1394,14 @@ static int mv_udc_start(struct usb_gadget_driver *driver, ...@@ -1399,26 +1394,14 @@ static int mv_udc_start(struct usb_gadget_driver *driver,
spin_unlock_irqrestore(&udc->lock, flags); spin_unlock_irqrestore(&udc->lock, flags);
retval = bind(&udc->gadget, driver);
if (retval) {
dev_err(&udc->dev->dev, "bind to driver %s --> %d\n",
driver->driver.name, retval);
udc->driver = NULL;
udc->gadget.dev.driver = NULL;
return retval;
}
if (!IS_ERR_OR_NULL(udc->transceiver)) { if (!IS_ERR_OR_NULL(udc->transceiver)) {
retval = otg_set_peripheral(udc->transceiver->otg, retval = otg_set_peripheral(udc->transceiver->otg,
&udc->gadget); &udc->gadget);
if (retval) { if (retval) {
dev_err(&udc->dev->dev, dev_err(&udc->dev->dev,
"unable to register peripheral to otg\n"); "unable to register peripheral to otg\n");
if (driver->unbind) { udc->driver = NULL;
driver->unbind(&udc->gadget); udc->gadget.dev.driver = NULL;
udc->gadget.dev.driver = NULL;
udc->driver = NULL;
}
return retval; return retval;
} }
} }
...@@ -1433,13 +1416,13 @@ static int mv_udc_start(struct usb_gadget_driver *driver, ...@@ -1433,13 +1416,13 @@ static int mv_udc_start(struct usb_gadget_driver *driver,
return 0; return 0;
} }
static int mv_udc_stop(struct usb_gadget_driver *driver) static int mv_udc_stop(struct usb_gadget *gadget,
struct usb_gadget_driver *driver)
{ {
struct mv_udc *udc = the_controller; struct mv_udc *udc;
unsigned long flags; unsigned long flags;
if (!udc) udc = container_of(gadget, struct mv_udc, gadget);
return -ENODEV;
spin_lock_irqsave(&udc->lock, flags); spin_lock_irqsave(&udc->lock, flags);
...@@ -1454,7 +1437,6 @@ static int mv_udc_stop(struct usb_gadget_driver *driver) ...@@ -1454,7 +1437,6 @@ static int mv_udc_stop(struct usb_gadget_driver *driver)
spin_unlock_irqrestore(&udc->lock, flags); spin_unlock_irqrestore(&udc->lock, flags);
/* unbind gadget driver */ /* unbind gadget driver */
driver->unbind(&udc->gadget);
udc->gadget.dev.driver = NULL; udc->gadget.dev.driver = NULL;
udc->driver = NULL; udc->driver = NULL;
...@@ -1472,10 +1454,13 @@ static void mv_set_ptc(struct mv_udc *udc, u32 mode) ...@@ -1472,10 +1454,13 @@ static void mv_set_ptc(struct mv_udc *udc, u32 mode)
static void prime_status_complete(struct usb_ep *ep, struct usb_request *_req) static void prime_status_complete(struct usb_ep *ep, struct usb_request *_req)
{ {
struct mv_udc *udc = the_controller; struct mv_ep *mvep = container_of(ep, struct mv_ep, ep);
struct mv_req *req = container_of(_req, struct mv_req, req); struct mv_req *req = container_of(_req, struct mv_req, req);
struct mv_udc *udc;
unsigned long flags; unsigned long flags;
udc = mvep->udc;
dev_info(&udc->dev->dev, "switch to test mode %d\n", req->test_mode); dev_info(&udc->dev->dev, "switch to test mode %d\n", req->test_mode);
spin_lock_irqsave(&udc->lock, flags); spin_lock_irqsave(&udc->lock, flags);
...@@ -2123,16 +2108,20 @@ static void mv_udc_vbus_work(struct work_struct *work) ...@@ -2123,16 +2108,20 @@ static void mv_udc_vbus_work(struct work_struct *work)
/* release device structure */ /* release device structure */
static void gadget_release(struct device *_dev) static void gadget_release(struct device *_dev)
{ {
struct mv_udc *udc = the_controller; struct mv_udc *udc;
udc = dev_get_drvdata(_dev);
complete(udc->done); complete(udc->done);
} }
static int mv_udc_remove(struct platform_device *dev) static int mv_udc_remove(struct platform_device *dev)
{ {
struct mv_udc *udc = the_controller; struct mv_udc *udc;
int clk_i; int clk_i;
udc = platform_get_drvdata(dev);
usb_del_gadget_udc(&udc->gadget); usb_del_gadget_udc(&udc->gadget);
if (udc->qwork) { if (udc->qwork) {
...@@ -2183,8 +2172,6 @@ static int mv_udc_remove(struct platform_device *dev) ...@@ -2183,8 +2172,6 @@ static int mv_udc_remove(struct platform_device *dev)
wait_for_completion(udc->done); wait_for_completion(udc->done);
kfree(udc); kfree(udc);
the_controller = NULL;
return 0; return 0;
} }
...@@ -2209,7 +2196,6 @@ static int mv_udc_probe(struct platform_device *dev) ...@@ -2209,7 +2196,6 @@ static int mv_udc_probe(struct platform_device *dev)
return -ENOMEM; return -ENOMEM;
} }
the_controller = udc;
udc->done = &release_done; udc->done = &release_done;
udc->pdata = dev->dev.platform_data; udc->pdata = dev->dev.platform_data;
spin_lock_init(&udc->lock); spin_lock_init(&udc->lock);
...@@ -2400,6 +2386,7 @@ static int mv_udc_probe(struct platform_device *dev) ...@@ -2400,6 +2386,7 @@ static int mv_udc_probe(struct platform_device *dev)
if (retval) if (retval)
goto err_unregister; goto err_unregister;
platform_set_drvdata(dev, udc);
dev_info(&dev->dev, "successful probe UDC device %s clock gating.\n", dev_info(&dev->dev, "successful probe UDC device %s clock gating.\n",
udc->clock_gating ? "with" : "without"); udc->clock_gating ? "with" : "without");
...@@ -2431,15 +2418,16 @@ static int mv_udc_probe(struct platform_device *dev) ...@@ -2431,15 +2418,16 @@ static int mv_udc_probe(struct platform_device *dev)
err_put_clk: err_put_clk:
for (clk_i--; clk_i >= 0; clk_i--) for (clk_i--; clk_i >= 0; clk_i--)
clk_put(udc->clk[clk_i]); clk_put(udc->clk[clk_i]);
the_controller = NULL;
kfree(udc); kfree(udc);
return retval; return retval;
} }
#ifdef CONFIG_PM #ifdef CONFIG_PM
static int mv_udc_suspend(struct device *_dev) static int mv_udc_suspend(struct device *dev)
{ {
struct mv_udc *udc = the_controller; struct mv_udc *udc;
udc = dev_get_drvdata(dev);
/* if OTG is enabled, the following will be done in OTG driver*/ /* if OTG is enabled, the following will be done in OTG driver*/
if (!IS_ERR_OR_NULL(udc->transceiver)) if (!IS_ERR_OR_NULL(udc->transceiver))
...@@ -2469,11 +2457,13 @@ static int mv_udc_suspend(struct device *_dev) ...@@ -2469,11 +2457,13 @@ static int mv_udc_suspend(struct device *_dev)
return 0; return 0;
} }
static int mv_udc_resume(struct device *_dev) static int mv_udc_resume(struct device *dev)
{ {
struct mv_udc *udc = the_controller; struct mv_udc *udc;
int retval; int retval;
udc = dev_get_drvdata(dev);
/* if OTG is enabled, the following will be done in OTG driver*/ /* if OTG is enabled, the following will be done in OTG driver*/
if (!IS_ERR_OR_NULL(udc->transceiver)) if (!IS_ERR_OR_NULL(udc->transceiver))
return 0; return 0;
...@@ -2501,9 +2491,10 @@ static const struct dev_pm_ops mv_udc_pm_ops = { ...@@ -2501,9 +2491,10 @@ static const struct dev_pm_ops mv_udc_pm_ops = {
static void mv_udc_shutdown(struct platform_device *dev) static void mv_udc_shutdown(struct platform_device *dev)
{ {
struct mv_udc *udc = the_controller; struct mv_udc *udc;
u32 mode; u32 mode;
udc = platform_get_drvdata(dev);
/* reset controller mode to IDLE */ /* reset controller mode to IDLE */
mv_udc_enable(udc); mv_udc_enable(udc);
mode = readl(&udc->op_regs->usbmode); mode = readl(&udc->op_regs->usbmode);
......
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