diff options
Diffstat (limited to 'drivers/usb/musb/musb_dsps.c')
-rw-r--r-- | drivers/usb/musb/musb_dsps.c | 55 |
1 files changed, 39 insertions, 16 deletions
diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c index 3b76b6cc61..d54a663e9d 100644 --- a/drivers/usb/musb/musb_dsps.c +++ b/drivers/usb/musb/musb_dsps.c @@ -39,7 +39,6 @@ #include <linux/barebox-wrapper.h> #include "musb_core.h" -#include "phy-am335x.h" static __maybe_unused struct of_device_id musb_dsps_dt_ids[]; @@ -217,10 +216,6 @@ static int dsps_musb_init(struct musb *musb) const struct dsps_musb_wrapper *wrp = glue->wrp; u32 rev, val, mode; - musb->xceiv = am335x_get_usb_phy(); - if (IS_ERR(musb->xceiv)) - return PTR_ERR(musb->xceiv); - /* Returns zero if e.g. not clocked */ rev = dsps_readl(musb->ctrl_base, wrp->revision); if (!rev) @@ -319,11 +314,13 @@ static int dsps_set_mode(void *ctx, enum usb_dr_mode mode) static int dsps_probe(struct device_d *dev) { - struct resource *iores; + struct resource *iores[2]; struct musb_hdrc_platform_data *pdata; struct musb_hdrc_config *config; struct device_node *dn = dev->device_node; const struct dsps_musb_wrapper *wrp; + struct device_node *phy_node; + struct device_d *phy_dev; struct dsps_glue *glue; int ret; @@ -337,6 +334,14 @@ static int dsps_probe(struct device_d *dev) return -ENODEV; } + phy_node = of_parse_phandle(dn, "phys", 0); + if (!phy_node) + return -ENODEV; + + phy_dev = of_find_device_by_node(phy_node); + if (!phy_dev || !phy_dev->priv) + return -EPROBE_DEFER; + /* allocate glue */ glue = kzalloc(sizeof(*glue), GFP_KERNEL); if (!glue) { @@ -349,17 +354,22 @@ static int dsps_probe(struct device_d *dev) pdata = &glue->pdata; - iores = dev_request_mem_resource(dev, 0); - if (IS_ERR(iores)) - return PTR_ERR(iores); - glue->musb.mregs = IOMEM(iores->start); + iores[0] = dev_request_mem_resource(dev, 0); + if (IS_ERR(iores[0])) { + ret = PTR_ERR(iores[0]); + goto free_glue; + } + glue->musb.mregs = IOMEM(iores[0]->start); - iores = dev_request_mem_resource(dev, 1); - if (IS_ERR(iores)) - return PTR_ERR(iores); - glue->musb.ctrl_base = IOMEM(iores->start); + iores[1] = dev_request_mem_resource(dev, 1); + if (IS_ERR(iores[1])) { + ret = PTR_ERR(iores[1]); + goto release_iores0; + } + glue->musb.ctrl_base = IOMEM(iores[1]->start); glue->musb.controller = dev; + glue->musb.xceiv = phy_dev->priv; config = &glue->config; @@ -377,11 +387,24 @@ static int dsps_probe(struct device_d *dev) if (pdata->mode == MUSB_PORT_MODE_DUAL_ROLE) { ret = usb_register_otg_device(dev, dsps_set_mode, glue); if (ret) - return ret; + goto release_iores1; return 0; } - return musb_init_controller(&glue->musb, pdata); + ret = musb_init_controller(&glue->musb, pdata); + if (ret) + goto release_iores1; + + return 0; + +release_iores1: + release_region(iores[1]); +release_iores0: + release_region(iores[0]); +free_glue: + free(glue); + + return ret; } static const struct dsps_musb_wrapper am33xx_driver_data = { |