diff options
Diffstat (limited to 'drivers/usb/core/usb.c')
-rw-r--r-- | drivers/usb/core/usb.c | 54 |
1 files changed, 38 insertions, 16 deletions
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c index 34a0f004f7..1f6f1d7c41 100644 --- a/drivers/usb/core/usb.c +++ b/drivers/usb/core/usb.c @@ -38,8 +38,8 @@ #include <init.h> #include <dma.h> -#include <usb/usb.h> -#include <usb/ch9.h> +#include <linux/usb/usb.h> +#include <linux/usb/ch9.h> #include "usb.h" @@ -77,7 +77,7 @@ static inline void usb_host_release(struct usb_host *host) slice_release(&host->slice); } -static int usb_hw_detect(struct device_d *dev) +static int usb_hw_detect(struct device *dev) { struct usb_host *host; @@ -477,8 +477,8 @@ int usb_new_device(struct usb_device *dev) /* we set the default configuration here */ err = usb_set_configuration(dev, dev->config.desc.bConfigurationValue); if (err) { - dev_err(&dev->dev, "Setting default configuration failed with: %s\n" \ - "len %d, status %lX\n", strerror(-err), + dev_err(&dev->dev, "Setting default configuration failed with: %pe\n" \ + "len %d, status %lX\n", ERR_PTR(err), dev->act_len, dev->status); goto err_out; } @@ -502,7 +502,7 @@ int usb_new_device(struct usb_device *dev) err = register_device(&dev->dev); if (err) { - dev_err(&dev->dev, "Failed to register device: %s\n", strerror(-err)); + dev_err(&dev->dev, "Failed to register device: %pe\n", ERR_PTR(err)); goto err_out; } @@ -576,6 +576,8 @@ int usb_host_detect(struct usb_host *host) { int ret; + of_usb_host_probe_hubs(host); + if (!host->root_dev) { if (host->init) { ret = host->init(host); @@ -599,7 +601,7 @@ int usb_host_detect(struct usb_host *host) return 0; } -void usb_rescan(void) +int usb_rescan(void) { struct usb_host *host; int ret; @@ -613,6 +615,22 @@ void usb_rescan(void) } pr_info("%d USB Device(s) found\n", dev_count); + + if (IS_ENABLED(CONFIG_USB_OTGDEV)) { + unsigned int skipped_otg = 0; + struct device *dev; + + bus_for_each_device(&otg_bus_type, dev) { + if (otg_device_get_mode(dev) == USB_DR_MODE_OTG) + skipped_otg++; + } + + if (skipped_otg) + pr_notice("%u unconfigured OTG controller(s) were not scanned\n", + skipped_otg); + } + + return dev_count; } /*------------------------------------------------------------------- @@ -960,15 +978,15 @@ static int usb_string_sub(struct usb_device *dev, unsigned int langid, */ int usb_string(struct usb_device *dev, int index, char *buf, size_t size) { - unsigned char mybuf[USB_BUFSIZ]; unsigned char *tbuf; - int err; + int err = 0; unsigned int u, idx; if (size <= 0 || !buf || !index) return -1; + + tbuf = dma_alloc(USB_BUFSIZ); buf[0] = 0; - tbuf = &mybuf[0]; /* get langid for strings if it's not yet known */ if (!dev->have_langid) { @@ -976,10 +994,12 @@ int usb_string(struct usb_device *dev, int index, char *buf, size_t size) if (err < 0) { dev_dbg(&dev->dev, "error getting string descriptor 0 " \ "(error=%lx)\n", dev->status); - return -1; + err = -1; + goto fail; } else if (tbuf[0] < 4) { pr_debug("string descriptor 0 too short\n"); - return -1; + err = -1; + goto fail; } else { dev->have_langid = -1; dev->string_langid = tbuf[2] | (tbuf[3] << 8); @@ -992,7 +1012,7 @@ int usb_string(struct usb_device *dev, int index, char *buf, size_t size) err = usb_string_sub(dev, dev->string_langid, index, tbuf); if (err < 0) - return err; + goto fail; size--; /* leave room for trailing NULL char in output buffer */ for (idx = 0, u = 2; u < err; u += 2) { @@ -1005,6 +1025,8 @@ int usb_string(struct usb_device *dev, int index, char *buf, size_t size) } buf[idx] = 0; err = idx; +fail: + dma_free(tbuf); return err; } @@ -1100,7 +1122,7 @@ static const struct usb_device_id *usb_match_id(struct usb_device *usbdev, } EXPORT_SYMBOL(usb_match_id); -static int usb_match(struct device_d *dev, struct driver_d *drv) +static int usb_match(struct device *dev, struct driver *drv) { struct usb_device *usbdev = container_of(dev, struct usb_device, dev); struct usb_driver *usbdrv = container_of(dev->driver, struct usb_driver, driver); @@ -1117,7 +1139,7 @@ static int usb_match(struct device_d *dev, struct driver_d *drv) return 1; } -static int usb_probe(struct device_d *dev) +static int usb_probe(struct device *dev) { struct usb_device *usbdev = container_of(dev, struct usb_device, dev); struct usb_driver *usbdrv = container_of(dev->driver, struct usb_driver, driver); @@ -1128,7 +1150,7 @@ static int usb_probe(struct device_d *dev) return usbdrv->probe(usbdev, id); } -static void usb_remove(struct device_d *dev) +static void usb_remove(struct device *dev) { struct usb_device *usbdev = container_of(dev, struct usb_device, dev); struct usb_driver *usbdrv = container_of(dev->driver, struct usb_driver, driver); |