|
@@ -2593,9 +2593,22 @@ omap_ep_setup(char *name, u8 addr, u8 type,
|
|
|
|
|
|
static void omap_udc_release(struct device *dev)
|
|
static void omap_udc_release(struct device *dev)
|
|
{
|
|
{
|
|
- complete(udc->done);
|
|
|
|
|
|
+ pullup_disable(udc);
|
|
|
|
+ if (!IS_ERR_OR_NULL(udc->transceiver)) {
|
|
|
|
+ usb_put_phy(udc->transceiver);
|
|
|
|
+ udc->transceiver = NULL;
|
|
|
|
+ }
|
|
|
|
+ omap_writew(0, UDC_SYSCON1);
|
|
|
|
+ remove_proc_file();
|
|
|
|
+ if (udc->dc_clk) {
|
|
|
|
+ if (udc->clk_requested)
|
|
|
|
+ omap_udc_enable_clock(0);
|
|
|
|
+ clk_put(udc->hhc_clk);
|
|
|
|
+ clk_put(udc->dc_clk);
|
|
|
|
+ }
|
|
|
|
+ if (udc->done)
|
|
|
|
+ complete(udc->done);
|
|
kfree(udc);
|
|
kfree(udc);
|
|
- udc = NULL;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
static int
|
|
static int
|
|
@@ -2900,12 +2913,8 @@ bad_on_1710:
|
|
}
|
|
}
|
|
|
|
|
|
create_proc_file();
|
|
create_proc_file();
|
|
- status = usb_add_gadget_udc_release(&pdev->dev, &udc->gadget,
|
|
|
|
- omap_udc_release);
|
|
|
|
- if (!status)
|
|
|
|
- return 0;
|
|
|
|
-
|
|
|
|
- remove_proc_file();
|
|
|
|
|
|
+ return usb_add_gadget_udc_release(&pdev->dev, &udc->gadget,
|
|
|
|
+ omap_udc_release);
|
|
|
|
|
|
cleanup1:
|
|
cleanup1:
|
|
kfree(udc);
|
|
kfree(udc);
|
|
@@ -2932,36 +2941,15 @@ static int omap_udc_remove(struct platform_device *pdev)
|
|
{
|
|
{
|
|
DECLARE_COMPLETION_ONSTACK(done);
|
|
DECLARE_COMPLETION_ONSTACK(done);
|
|
|
|
|
|
- if (!udc)
|
|
|
|
- return -ENODEV;
|
|
|
|
-
|
|
|
|
- usb_del_gadget_udc(&udc->gadget);
|
|
|
|
- if (udc->driver)
|
|
|
|
- return -EBUSY;
|
|
|
|
-
|
|
|
|
udc->done = &done;
|
|
udc->done = &done;
|
|
|
|
|
|
- pullup_disable(udc);
|
|
|
|
- if (!IS_ERR_OR_NULL(udc->transceiver)) {
|
|
|
|
- usb_put_phy(udc->transceiver);
|
|
|
|
- udc->transceiver = NULL;
|
|
|
|
- }
|
|
|
|
- omap_writew(0, UDC_SYSCON1);
|
|
|
|
-
|
|
|
|
- remove_proc_file();
|
|
|
|
|
|
+ usb_del_gadget_udc(&udc->gadget);
|
|
|
|
|
|
- if (udc->dc_clk) {
|
|
|
|
- if (udc->clk_requested)
|
|
|
|
- omap_udc_enable_clock(0);
|
|
|
|
- clk_put(udc->hhc_clk);
|
|
|
|
- clk_put(udc->dc_clk);
|
|
|
|
- }
|
|
|
|
|
|
+ wait_for_completion(&done);
|
|
|
|
|
|
release_mem_region(pdev->resource[0].start,
|
|
release_mem_region(pdev->resource[0].start,
|
|
pdev->resource[0].end - pdev->resource[0].start + 1);
|
|
pdev->resource[0].end - pdev->resource[0].start + 1);
|
|
|
|
|
|
- wait_for_completion(&done);
|
|
|
|
-
|
|
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|