usb: fixes for v3.9-rc2
A few drivers got their gadget->dev registration problems exposed by the removal of ->start()/->stop() functions from udc-core.c. All of such instances are now fixed. We're also fixing chipidea's mistake of registering private debugging sysfs files under the gadget's device. This is in preparation to complete removal of gadget->dev handling from all UDC drivers which will happen for v3.10 merge window. MUSB's Kconfig got a fix to avoid a non-buildable selection of its Kconfig choices. Some extra devm_ioremap_resource() are added here because they missed the merge window. Finally, we have a temporary fix linking function drivers before gadget drivers so they work fine when they're statically linked to the kernel. We've done it so since the real fix wouldn't fit the -rc cycle. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAABAgAGBQJRNI3HAAoJEIaOsuA1yqREWzUQAJNQfEGnrc3RuUQi/TOHs77K 7mGSd9TAdkjbq++ToxBD7ofx6rt7WwkpHYreTFgde8lH9l9fmKdZp30T4WYNZIDp tiiLPzyAqcaVW8iaEAyINTUgalfDBSJAYSLK4abb4KLVSq7ZEWsxTnGXoRyx/bRm tjTXu2TDBQg6CjxXNyRC7hX1ErHz86mNQV5RU+uGoUzQLU6X3OQ3n1DrzVMC3wWP llZcYIayZmsMocqgR5kAym8ujrjce5Qoww4vl/f+PpHAXS8lK/X0fZKn5sKPszIu zUYDpFrJ62v8M1AzC9k4pIP5XLm2jA3bPO3UPeOjgmXGYy9iI9AVY0V9VtV4xFjQ cYeNzE5vS97qwzqdz6WaxOnOEZgI0WgejKfiM/qNV6ov7lebkkhju6NoH0TDW5uS llQceJJJIpVvJHbOVpZ8KRd3yOn/jZGAqQzpSla52U9L9zmDLY5RMZRtIPHGK8gn Dnvq7+6R0IVT1RPYiXpJg7hEwbj3ywxT1c8kw1xJzFjYDeGoUWxVmKPNzTDLomJr 63gfJI2yqKKHPYumKIGSTYDHNca657XVR4qc9K7MgGyVJ51XIs8vbCtf0T26Q87K PYvilB4BtIQuGD+CSjFSn/LIqaHRqD5NpxrkMX8GBz9DtOBxYnckMiIYnkx/zfKu mQXNTa9O/3UCyZtgGST1 =mt8m -----END PGP SIGNATURE----- Merge tag 'fixes-for-v3.9-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb into usb-linus Felipe writes: "usb: fixes for v3.9-rc2 A few drivers got their gadget->dev registration problems exposed by the removal of ->start()/->stop() functions from udc-core.c. All of such instances are now fixed. We're also fixing chipidea's mistake of registering private debugging sysfs files under the gadget's device. This is in preparation to complete removal of gadget->dev handling from all UDC drivers which will happen for v3.10 merge window. MUSB's Kconfig got a fix to avoid a non-buildable selection of its Kconfig choices. Some extra devm_ioremap_resource() are added here because they missed the merge window. Finally, we have a temporary fix linking function drivers before gadget drivers so they work fine when they're statically linked to the kernel. We've done it so since the real fix wouldn't fit the -rc cycle."
This commit is contained in:
commit
ea5301aa13
|
@ -1767,7 +1767,7 @@ static int udc_start(struct ci13xxx *ci)
|
|||
goto put_transceiver;
|
||||
}
|
||||
|
||||
retval = dbg_create_files(&ci->gadget.dev);
|
||||
retval = dbg_create_files(ci->dev);
|
||||
if (retval)
|
||||
goto unreg_device;
|
||||
|
||||
|
@ -1796,7 +1796,7 @@ remove_trans:
|
|||
|
||||
dev_err(dev, "error = %i\n", retval);
|
||||
remove_dbg:
|
||||
dbg_remove_files(&ci->gadget.dev);
|
||||
dbg_remove_files(ci->dev);
|
||||
unreg_device:
|
||||
device_unregister(&ci->gadget.dev);
|
||||
put_transceiver:
|
||||
|
@ -1836,7 +1836,7 @@ static void udc_stop(struct ci13xxx *ci)
|
|||
if (ci->global_phy)
|
||||
usb_put_phy(ci->transceiver);
|
||||
}
|
||||
dbg_remove_files(&ci->gadget.dev);
|
||||
dbg_remove_files(ci->dev);
|
||||
device_unregister(&ci->gadget.dev);
|
||||
/* my kobject is dynamic, I swear! */
|
||||
memset(&ci->gadget, 0, sizeof(ci->gadget));
|
||||
|
|
|
@ -583,6 +583,7 @@ static int dwc3_remove(struct platform_device *pdev)
|
|||
break;
|
||||
}
|
||||
|
||||
dwc3_free_event_buffers(dwc);
|
||||
dwc3_core_exit(dwc);
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -23,8 +23,6 @@
|
|||
#include <linux/usb/nop-usb-xceiv.h>
|
||||
#include <linux/of.h>
|
||||
|
||||
#include "core.h"
|
||||
|
||||
struct dwc3_exynos {
|
||||
struct platform_device *dwc3;
|
||||
struct platform_device *usb2_phy;
|
||||
|
|
|
@ -54,8 +54,6 @@
|
|||
#include <linux/usb/otg.h>
|
||||
#include <linux/usb/nop-usb-xceiv.h>
|
||||
|
||||
#include "core.h"
|
||||
|
||||
/*
|
||||
* All these registers belong to OMAP's Wrapper around the
|
||||
* DesignWare USB3 Core.
|
||||
|
@ -465,20 +463,20 @@ static int dwc3_omap_remove(struct platform_device *pdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static const struct of_device_id of_dwc3_matach[] = {
|
||||
static const struct of_device_id of_dwc3_match[] = {
|
||||
{
|
||||
"ti,dwc3",
|
||||
},
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, of_dwc3_matach);
|
||||
MODULE_DEVICE_TABLE(of, of_dwc3_match);
|
||||
|
||||
static struct platform_driver dwc3_omap_driver = {
|
||||
.probe = dwc3_omap_probe,
|
||||
.remove = dwc3_omap_remove,
|
||||
.driver = {
|
||||
.name = "omap-dwc3",
|
||||
.of_match_table = of_dwc3_matach,
|
||||
.of_match_table = of_dwc3_match,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -45,8 +45,6 @@
|
|||
#include <linux/usb/otg.h>
|
||||
#include <linux/usb/nop-usb-xceiv.h>
|
||||
|
||||
#include "core.h"
|
||||
|
||||
/* FIXME define these in <linux/pci_ids.h> */
|
||||
#define PCI_VENDOR_ID_SYNOPSYS 0x16c3
|
||||
#define PCI_DEVICE_ID_SYNOPSYS_HAPSUSB3 0xabcd
|
||||
|
|
|
@ -2159,7 +2159,6 @@ static void dwc3_gadget_phy_suspend(struct dwc3 *dwc, u8 speed)
|
|||
|
||||
static void dwc3_gadget_conndone_interrupt(struct dwc3 *dwc)
|
||||
{
|
||||
struct dwc3_gadget_ep_cmd_params params;
|
||||
struct dwc3_ep *dep;
|
||||
int ret;
|
||||
u32 reg;
|
||||
|
@ -2167,8 +2166,6 @@ static void dwc3_gadget_conndone_interrupt(struct dwc3 *dwc)
|
|||
|
||||
dev_vdbg(dwc->dev, "%s\n", __func__);
|
||||
|
||||
memset(¶ms, 0x00, sizeof(params));
|
||||
|
||||
reg = dwc3_readl(dwc->regs, DWC3_DSTS);
|
||||
speed = reg & DWC3_DSTS_CONNECTSPD;
|
||||
dwc->speed = speed;
|
||||
|
|
|
@ -35,6 +35,12 @@ mv_udc-y := mv_udc_core.o
|
|||
obj-$(CONFIG_USB_FUSB300) += fusb300_udc.o
|
||||
obj-$(CONFIG_USB_MV_U3D) += mv_u3d_core.o
|
||||
|
||||
# USB Functions
|
||||
obj-$(CONFIG_USB_F_ACM) += f_acm.o
|
||||
f_ss_lb-y := f_loopback.o f_sourcesink.o
|
||||
obj-$(CONFIG_USB_F_SS_LB) += f_ss_lb.o
|
||||
obj-$(CONFIG_USB_U_SERIAL) += u_serial.o
|
||||
|
||||
#
|
||||
# USB gadget drivers
|
||||
#
|
||||
|
@ -74,9 +80,3 @@ obj-$(CONFIG_USB_G_WEBCAM) += g_webcam.o
|
|||
obj-$(CONFIG_USB_G_NCM) += g_ncm.o
|
||||
obj-$(CONFIG_USB_G_ACM_MS) += g_acm_ms.o
|
||||
obj-$(CONFIG_USB_GADGET_TARGET) += tcm_usb_gadget.o
|
||||
|
||||
# USB Functions
|
||||
obj-$(CONFIG_USB_F_ACM) += f_acm.o
|
||||
f_ss_lb-y := f_loopback.o f_sourcesink.o
|
||||
obj-$(CONFIG_USB_F_SS_LB) += f_ss_lb.o
|
||||
obj-$(CONFIG_USB_U_SERIAL) += u_serial.o
|
||||
|
|
|
@ -418,6 +418,7 @@ static int audio_get_intf_req(struct usb_function *f,
|
|||
|
||||
req->context = audio;
|
||||
req->complete = f_audio_complete;
|
||||
len = min_t(size_t, sizeof(value), len);
|
||||
memcpy(req->buf, &value, len);
|
||||
|
||||
return len;
|
||||
|
|
|
@ -1334,27 +1334,18 @@ static int imx_udc_start(struct usb_gadget *gadget,
|
|||
struct usb_gadget_driver *driver)
|
||||
{
|
||||
struct imx_udc_struct *imx_usb;
|
||||
int retval;
|
||||
|
||||
imx_usb = container_of(gadget, struct imx_udc_struct, gadget);
|
||||
/* first hook up the driver ... */
|
||||
imx_usb->driver = driver;
|
||||
imx_usb->gadget.dev.driver = &driver->driver;
|
||||
|
||||
retval = device_add(&imx_usb->gadget.dev);
|
||||
if (retval)
|
||||
goto fail;
|
||||
|
||||
D_INI(imx_usb->dev, "<%s> registered gadget driver '%s'\n",
|
||||
__func__, driver->driver.name);
|
||||
|
||||
imx_udc_enable(imx_usb);
|
||||
|
||||
return 0;
|
||||
fail:
|
||||
imx_usb->driver = NULL;
|
||||
imx_usb->gadget.dev.driver = NULL;
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int imx_udc_stop(struct usb_gadget *gadget,
|
||||
|
@ -1370,8 +1361,6 @@ static int imx_udc_stop(struct usb_gadget *gadget,
|
|||
imx_usb->gadget.dev.driver = NULL;
|
||||
imx_usb->driver = NULL;
|
||||
|
||||
device_del(&imx_usb->gadget.dev);
|
||||
|
||||
D_INI(imx_usb->dev, "<%s> unregistered gadget driver '%s'\n",
|
||||
__func__, driver->driver.name);
|
||||
|
||||
|
@ -1477,6 +1466,10 @@ static int __init imx_udc_probe(struct platform_device *pdev)
|
|||
imx_usb->gadget.dev.parent = &pdev->dev;
|
||||
imx_usb->gadget.dev.dma_mask = pdev->dev.dma_mask;
|
||||
|
||||
ret = device_add(&imx_usb->gadget.dev);
|
||||
if (retval)
|
||||
goto fail4;
|
||||
|
||||
platform_set_drvdata(pdev, imx_usb);
|
||||
|
||||
usb_init_data(imx_usb);
|
||||
|
@ -1488,9 +1481,11 @@ static int __init imx_udc_probe(struct platform_device *pdev)
|
|||
|
||||
ret = usb_add_gadget_udc(&pdev->dev, &imx_usb->gadget);
|
||||
if (ret)
|
||||
goto fail4;
|
||||
goto fail5;
|
||||
|
||||
return 0;
|
||||
fail5:
|
||||
device_unregister(&imx_usb->gadget.dev);
|
||||
fail4:
|
||||
for (i = 0; i < IMX_USB_NB_EP + 1; i++)
|
||||
free_irq(imx_usb->usbd_int[i], imx_usb);
|
||||
|
@ -1514,6 +1509,7 @@ static int __exit imx_udc_remove(struct platform_device *pdev)
|
|||
int i;
|
||||
|
||||
usb_del_gadget_udc(&imx_usb->gadget);
|
||||
device_unregister(&imx_usb->gadget.dev);
|
||||
imx_udc_disable(imx_usb);
|
||||
del_timer(&imx_usb->timer);
|
||||
|
||||
|
|
|
@ -1266,13 +1266,6 @@ static int pxa25x_udc_start(struct usb_gadget *g,
|
|||
dev->gadget.dev.driver = &driver->driver;
|
||||
dev->pullup = 1;
|
||||
|
||||
retval = device_add (&dev->gadget.dev);
|
||||
if (retval) {
|
||||
dev->driver = NULL;
|
||||
dev->gadget.dev.driver = NULL;
|
||||
return retval;
|
||||
}
|
||||
|
||||
/* ... then enable host detection and ep0; and we're ready
|
||||
* for set_configuration as well as eventual disconnect.
|
||||
*/
|
||||
|
@ -1331,7 +1324,6 @@ static int pxa25x_udc_stop(struct usb_gadget*g,
|
|||
dev->gadget.dev.driver = NULL;
|
||||
dev->driver = NULL;
|
||||
|
||||
device_del (&dev->gadget.dev);
|
||||
dump_state(dev);
|
||||
|
||||
return 0;
|
||||
|
@ -2146,6 +2138,13 @@ static int __init pxa25x_udc_probe(struct platform_device *pdev)
|
|||
dev->gadget.dev.parent = &pdev->dev;
|
||||
dev->gadget.dev.dma_mask = pdev->dev.dma_mask;
|
||||
|
||||
retval = device_add(&dev->gadget.dev);
|
||||
if (retval) {
|
||||
dev->driver = NULL;
|
||||
dev->gadget.dev.driver = NULL;
|
||||
goto err_device_add;
|
||||
}
|
||||
|
||||
the_controller = dev;
|
||||
platform_set_drvdata(pdev, dev);
|
||||
|
||||
|
@ -2196,6 +2195,8 @@ lubbock_fail0:
|
|||
free_irq(irq, dev);
|
||||
#endif
|
||||
err_irq1:
|
||||
device_unregister(&dev->gadget.dev);
|
||||
err_device_add:
|
||||
if (gpio_is_valid(dev->mach->gpio_pullup))
|
||||
gpio_free(dev->mach->gpio_pullup);
|
||||
err_gpio_pullup:
|
||||
|
@ -2217,10 +2218,11 @@ static int __exit pxa25x_udc_remove(struct platform_device *pdev)
|
|||
{
|
||||
struct pxa25x_udc *dev = platform_get_drvdata(pdev);
|
||||
|
||||
usb_del_gadget_udc(&dev->gadget);
|
||||
if (dev->driver)
|
||||
return -EBUSY;
|
||||
|
||||
usb_del_gadget_udc(&dev->gadget);
|
||||
device_unregister(&dev->gadget.dev);
|
||||
dev->pullup = 0;
|
||||
pullup(dev);
|
||||
|
||||
|
|
|
@ -1814,11 +1814,6 @@ static int pxa27x_udc_start(struct usb_gadget *g,
|
|||
udc->gadget.dev.driver = &driver->driver;
|
||||
dplus_pullup(udc, 1);
|
||||
|
||||
retval = device_add(&udc->gadget.dev);
|
||||
if (retval) {
|
||||
dev_err(udc->dev, "device_add error %d\n", retval);
|
||||
goto fail;
|
||||
}
|
||||
if (!IS_ERR_OR_NULL(udc->transceiver)) {
|
||||
retval = otg_set_peripheral(udc->transceiver->otg,
|
||||
&udc->gadget);
|
||||
|
@ -1876,7 +1871,6 @@ static int pxa27x_udc_stop(struct usb_gadget *g,
|
|||
|
||||
udc->driver = NULL;
|
||||
|
||||
device_del(&udc->gadget.dev);
|
||||
|
||||
if (!IS_ERR_OR_NULL(udc->transceiver))
|
||||
return otg_set_peripheral(udc->transceiver->otg, NULL);
|
||||
|
@ -2480,13 +2474,24 @@ static int __init pxa_udc_probe(struct platform_device *pdev)
|
|||
driver_name, udc->irq, retval);
|
||||
goto err_irq;
|
||||
}
|
||||
|
||||
retval = device_add(&udc->gadget.dev);
|
||||
if (retval) {
|
||||
dev_err(udc->dev, "device_add error %d\n", retval);
|
||||
goto err_dev_add;
|
||||
}
|
||||
|
||||
retval = usb_add_gadget_udc(&pdev->dev, &udc->gadget);
|
||||
if (retval)
|
||||
goto err_add_udc;
|
||||
|
||||
pxa_init_debugfs(udc);
|
||||
|
||||
return 0;
|
||||
|
||||
err_add_udc:
|
||||
device_unregister(&udc->gadget.dev);
|
||||
err_dev_add:
|
||||
free_irq(udc->irq, udc);
|
||||
err_irq:
|
||||
iounmap(udc->regs);
|
||||
|
@ -2507,6 +2512,7 @@ static int __exit pxa_udc_remove(struct platform_device *_dev)
|
|||
int gpio = udc->mach->gpio_pullup;
|
||||
|
||||
usb_del_gadget_udc(&udc->gadget);
|
||||
device_del(&udc->gadget.dev);
|
||||
usb_gadget_unregister_driver(udc->driver);
|
||||
free_irq(udc->irq, udc);
|
||||
pxa_cleanup_debugfs(udc);
|
||||
|
|
|
@ -1668,8 +1668,7 @@ static void s3c2410_udc_enable(struct s3c2410_udc *dev)
|
|||
static int s3c2410_udc_start(struct usb_gadget *g,
|
||||
struct usb_gadget_driver *driver)
|
||||
{
|
||||
struct s3c2410_udc *udc = to_s3c2410(g)
|
||||
int retval;
|
||||
struct s3c2410_udc *udc = to_s3c2410(g);
|
||||
|
||||
dprintk(DEBUG_NORMAL, "%s() '%s'\n", __func__, driver->driver.name);
|
||||
|
||||
|
@ -1677,22 +1676,10 @@ static int s3c2410_udc_start(struct usb_gadget *g,
|
|||
udc->driver = driver;
|
||||
udc->gadget.dev.driver = &driver->driver;
|
||||
|
||||
/* Bind the driver */
|
||||
retval = device_add(&udc->gadget.dev);
|
||||
if (retval) {
|
||||
dev_err(&udc->gadget.dev, "Error in device_add() : %d\n", retval);
|
||||
goto register_error;
|
||||
}
|
||||
|
||||
/* Enable udc */
|
||||
s3c2410_udc_enable(udc);
|
||||
|
||||
return 0;
|
||||
|
||||
register_error:
|
||||
udc->driver = NULL;
|
||||
udc->gadget.dev.driver = NULL;
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int s3c2410_udc_stop(struct usb_gadget *g,
|
||||
|
@ -1700,7 +1687,6 @@ static int s3c2410_udc_stop(struct usb_gadget *g,
|
|||
{
|
||||
struct s3c2410_udc *udc = to_s3c2410(g);
|
||||
|
||||
device_del(&udc->gadget.dev);
|
||||
udc->driver = NULL;
|
||||
|
||||
/* Disable udc */
|
||||
|
@ -1842,6 +1828,13 @@ static int s3c2410_udc_probe(struct platform_device *pdev)
|
|||
udc->gadget.dev.parent = &pdev->dev;
|
||||
udc->gadget.dev.dma_mask = pdev->dev.dma_mask;
|
||||
|
||||
/* Bind the driver */
|
||||
retval = device_add(&udc->gadget.dev);
|
||||
if (retval) {
|
||||
dev_err(&udc->gadget.dev, "Error in device_add() : %d\n", retval);
|
||||
goto err_device_add;
|
||||
}
|
||||
|
||||
the_controller = udc;
|
||||
platform_set_drvdata(pdev, udc);
|
||||
|
||||
|
@ -1930,6 +1923,8 @@ err_gpio_claim:
|
|||
err_int:
|
||||
free_irq(IRQ_USBD, udc);
|
||||
err_map:
|
||||
device_unregister(&udc->gadget.dev);
|
||||
err_device_add:
|
||||
iounmap(base_addr);
|
||||
err_mem:
|
||||
release_mem_region(rsrc_start, rsrc_len);
|
||||
|
@ -1947,10 +1942,11 @@ static int s3c2410_udc_remove(struct platform_device *pdev)
|
|||
|
||||
dev_dbg(&pdev->dev, "%s()\n", __func__);
|
||||
|
||||
usb_del_gadget_udc(&udc->gadget);
|
||||
if (udc->driver)
|
||||
return -EBUSY;
|
||||
|
||||
usb_del_gadget_udc(&udc->gadget);
|
||||
device_unregister(&udc->gadget.dev);
|
||||
debugfs_remove(udc->regs_info);
|
||||
|
||||
if (udc_info && !udc_info->udc_command &&
|
||||
|
|
|
@ -240,8 +240,11 @@ static int gaudio_open_snd_dev(struct gaudio *card)
|
|||
snd = &card->playback;
|
||||
snd->filp = filp_open(fn_play, O_WRONLY, 0);
|
||||
if (IS_ERR(snd->filp)) {
|
||||
int ret = PTR_ERR(snd->filp);
|
||||
|
||||
ERROR(card, "No such PCM playback device: %s\n", fn_play);
|
||||
snd->filp = NULL;
|
||||
return ret;
|
||||
}
|
||||
pcm_file = snd->filp->private_data;
|
||||
snd->substream = pcm_file->substream;
|
||||
|
|
|
@ -9,8 +9,6 @@ config USB_MUSB_HDRC
|
|||
depends on USB && USB_GADGET
|
||||
select NOP_USB_XCEIV if (ARCH_DAVINCI || MACH_OMAP3EVM || BLACKFIN)
|
||||
select NOP_USB_XCEIV if (SOC_TI81XX || SOC_AM33XX)
|
||||
select TWL4030_USB if MACH_OMAP_3430SDP
|
||||
select TWL6030_USB if MACH_OMAP_4430SDP || MACH_OMAP4_PANDA
|
||||
select OMAP_CONTROL_USB if MACH_OMAP_4430SDP || MACH_OMAP4_PANDA
|
||||
select USB_OTG_UTILS
|
||||
help
|
||||
|
@ -51,6 +49,8 @@ config USB_MUSB_TUSB6010
|
|||
config USB_MUSB_OMAP2PLUS
|
||||
tristate "OMAP2430 and onwards"
|
||||
depends on ARCH_OMAP2PLUS
|
||||
select TWL4030_USB if MACH_OMAP_3430SDP
|
||||
select TWL6030_USB if MACH_OMAP_4430SDP || MACH_OMAP4_PANDA
|
||||
|
||||
config USB_MUSB_AM35X
|
||||
tristate "AM35x"
|
||||
|
|
|
@ -130,7 +130,7 @@ struct usb_phy *usb_get_phy(enum usb_phy_type type)
|
|||
spin_lock_irqsave(&phy_lock, flags);
|
||||
|
||||
phy = __usb_find_phy(&phy_list, type);
|
||||
if (IS_ERR(phy)) {
|
||||
if (IS_ERR(phy) || !try_module_get(phy->dev->driver->owner)) {
|
||||
pr_err("unable to find transceiver of type %s\n",
|
||||
usb_phy_type_string(type));
|
||||
goto err0;
|
||||
|
@ -228,7 +228,7 @@ struct usb_phy *usb_get_phy_dev(struct device *dev, u8 index)
|
|||
spin_lock_irqsave(&phy_lock, flags);
|
||||
|
||||
phy = __usb_find_phy_dev(dev, &phy_bind_list, index);
|
||||
if (IS_ERR(phy)) {
|
||||
if (IS_ERR(phy) || !try_module_get(phy->dev->driver->owner)) {
|
||||
pr_err("unable to find transceiver\n");
|
||||
goto err0;
|
||||
}
|
||||
|
@ -301,8 +301,12 @@ EXPORT_SYMBOL(devm_usb_put_phy);
|
|||
*/
|
||||
void usb_put_phy(struct usb_phy *x)
|
||||
{
|
||||
if (x)
|
||||
if (x) {
|
||||
struct module *owner = x->dev->driver->owner;
|
||||
|
||||
put_device(x->dev);
|
||||
module_put(owner);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(usb_put_phy);
|
||||
|
||||
|
|
|
@ -219,32 +219,26 @@ static int omap_control_usb_probe(struct platform_device *pdev)
|
|||
|
||||
res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
|
||||
"control_dev_conf");
|
||||
control_usb->dev_conf = devm_request_and_ioremap(&pdev->dev, res);
|
||||
if (!control_usb->dev_conf) {
|
||||
dev_err(&pdev->dev, "Failed to obtain io memory\n");
|
||||
return -EADDRNOTAVAIL;
|
||||
}
|
||||
control_usb->dev_conf = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(control_usb->dev_conf))
|
||||
return PTR_ERR(control_usb->dev_conf);
|
||||
|
||||
if (control_usb->type == OMAP_CTRL_DEV_TYPE1) {
|
||||
res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
|
||||
"otghs_control");
|
||||
control_usb->otghs_control = devm_request_and_ioremap(
|
||||
control_usb->otghs_control = devm_ioremap_resource(
|
||||
&pdev->dev, res);
|
||||
if (!control_usb->otghs_control) {
|
||||
dev_err(&pdev->dev, "Failed to obtain io memory\n");
|
||||
return -EADDRNOTAVAIL;
|
||||
}
|
||||
if (IS_ERR(control_usb->otghs_control))
|
||||
return PTR_ERR(control_usb->otghs_control);
|
||||
}
|
||||
|
||||
if (control_usb->type == OMAP_CTRL_DEV_TYPE2) {
|
||||
res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
|
||||
"phy_power_usb");
|
||||
control_usb->phy_power = devm_request_and_ioremap(
|
||||
control_usb->phy_power = devm_ioremap_resource(
|
||||
&pdev->dev, res);
|
||||
if (!control_usb->phy_power) {
|
||||
dev_dbg(&pdev->dev, "Failed to obtain io memory\n");
|
||||
return -EADDRNOTAVAIL;
|
||||
}
|
||||
if (IS_ERR(control_usb->phy_power))
|
||||
return PTR_ERR(control_usb->phy_power);
|
||||
|
||||
control_usb->sys_clk = devm_clk_get(control_usb->dev,
|
||||
"sys_clkin");
|
||||
|
|
|
@ -212,11 +212,9 @@ static int omap_usb3_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "pll_ctrl");
|
||||
phy->pll_ctrl_base = devm_request_and_ioremap(&pdev->dev, res);
|
||||
if (!phy->pll_ctrl_base) {
|
||||
dev_err(&pdev->dev, "ioremap of pll_ctrl failed\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
phy->pll_ctrl_base = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(phy->pll_ctrl_base))
|
||||
return PTR_ERR(phy->pll_ctrl_base);
|
||||
|
||||
phy->dev = &pdev->dev;
|
||||
|
||||
|
|
|
@ -787,11 +787,9 @@ static int samsung_usbphy_probe(struct platform_device *pdev)
|
|||
return -ENODEV;
|
||||
}
|
||||
|
||||
phy_base = devm_request_and_ioremap(dev, phy_mem);
|
||||
if (!phy_base) {
|
||||
dev_err(dev, "%s: register mapping failed\n", __func__);
|
||||
return -ENXIO;
|
||||
}
|
||||
phy_base = devm_ioremap_resource(dev, phy_mem);
|
||||
if (IS_ERR(phy_base))
|
||||
return PTR_ERR(phy_base);
|
||||
|
||||
sphy = devm_kzalloc(dev, sizeof(*sphy), GFP_KERNEL);
|
||||
if (!sphy)
|
||||
|
|
Loading…
Reference in a new issue